Puppeteer против Selenium: что выбрать для парсинга веб-страниц?

Пичаи Нурджана
Сообщение от
Пичаи Нурджана

Выбирайте и покупайте прокси

Puppeteer против Selenium: что выбрать для парсинга веб-страниц?
0 комментариев

Вы пытаетесь выбрать между Puppeteer и Selenium для парсинга веб-страниц? Оба являются мощными платформами автоматизации браузера, и правильный выбор зависит от ваших конкретных потребностей в парсинге и доступных ресурсов.

Чтобы помочь вам принять обоснованное решение, мы выделили ключевые различия между Puppeteer и Selenium в таблице ниже. После этого мы углубимся в детали и предоставим пример парсинга для каждой платформы, чтобы продемонстрировать их эффективность при извлечении данных с веб-страниц.

КритерииКукловодСелен
Совместимые языкиОфициально поддерживается только JavaScript, но существуют неофициальные порты PHP и Python.Java, Python, C#, Ruby, PHP, JavaScript и Kotlin
Поддержка браузераПоддержка Chromium и экспериментального FirefoxChrome, Safari, Firefox, Opera, Edge и Internet Explorer
Производительность60% быстрее, чем SeleniumБыстрый
Поддержка операционной системыWindows, Linux и macOSWindows, Linux, macOS и Solaris
АрхитектураАрхитектура, управляемая событиями, с автономными экземплярами браузераПротокол JSONWire в веб-драйвере для управления экземпляром браузера.
Предварительные условияПакета JavaScript достаточноSelenium Bindings (для выбранного языка программирования) и веб-драйверы браузера.
СообществоМеньшее сообщество по сравнению с SeleniumХорошо налаженная документация и большое сообщество

Давайте перейдем к подробному обсуждению этих библиотек и приведем пример очистки каждой из них, чтобы проиллюстрировать их эффективность при извлечении данных с веб-страницы.

Логотип Кукольника

Кукловод

Кукловод — это библиотека Node.js, которая предоставляет API высокого уровня для управления Chrome или Chromium через протокол DevTools. Он предназначен для автоматизации задач в Chrome или Chromium, таких как создание снимков экрана, создание PDF-файлов и навигация по страницам.

Puppeteer также можно использовать для тестирования веб-страниц, моделируя взаимодействия с пользователем, такие как нажатие кнопок, заполнение форм и проверка отображаемых результатов.

Преимущества компании «Кукловод»

  • Простота использования: Простой и понятный в использовании.
  • В комплекте с Хромом: Никакой дополнительной настройки не требуется.
  • Безголовый режим: по умолчанию запускается в автономном режиме, но его можно настроить для работы в полнофункциональном режиме браузера.
  • Событийно-ориентированная архитектура: устраняет необходимость в ручных вызовах сна в вашем коде.
  • Комплексные возможности: может делать снимки экрана, создавать PDF-файлы и автоматизировать все действия браузера.
  • Управление производительностью: предлагает инструменты для записи времени выполнения и производительности загрузки для оптимизации и отладки парсера.
  • СПА Ползание: Способен сканировать одностраничные приложения (SPA) и генерировать предварительно обработанный контент (рендеринг на стороне сервера).
  • Запись сценария: позволяет создавать сценарии Puppeteer, записывая действия в браузере с помощью консоли DevTools.

Недостатки «Кукловода»

  • Ограниченная поддержка браузера: поддерживает меньшее количество браузеров по сравнению с Selenium.
  • Ориентирован на JavaScript: в основном поддерживает JavaScript, хотя существуют неофициальные порты для Python и PHP.

Пример парсинга веб-страниц с помощью Puppeteer

Давайте пройдемся по учебнику по парсингу веб-сайтов Puppeteer, чтобы извлечь элементы из категории «Криминалы и триллеры» на веб-сайте Danube.

Магазин «Дунай»: криминал и триллеры

Для начала импортируйте модуль Puppeteer и создайте асинхронную функцию для запуска кода Puppeteer:

const puppeteer = require('puppeteer'); 

async function main() { 
    // Launch a headless browser instance 
    const browser = await puppeteer.launch({ headless: true });

    // Create a new page object 
    const page = await browser.newPage();

    // Navigate to the target URL and wait until the loading finishes
    await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });

    // Wait for the left-side bar to load
    await page.waitForSelector('ul.sidebar-list');

    // Click on the first element and wait for the navigation to finish
    await Promise.all([
        page.waitForNavigation(),
        page.click("ul[class='sidebar-list'] > li > a"),
    ]);

    // Wait for the book previews to load
    await page.waitForSelector("li[class='preview']");

    // Extract the book previews
    const books = await page.evaluateHandle(
        () => [...document.querySelectorAll("li[class='preview']")]
    );

    // Extract the relevant data using page.evaluate
    const processed_data = await page.evaluate(elements => {
        let data = [];
        elements.forEach(element => {
            let title = element.querySelector("div.preview-title").innerHTML;
            let author = element.querySelector("div.preview-author").innerHTML;
            let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
            let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;

            let result = { title, author, rating, price };
            data.push(result);
        });
        return data;
    }, books);

    // Print out the extracted data
    console.log(processed_data);

    // Close the page and browser respectively
    await page.close();
    await browser.close();
}

// Run the main function to scrape the data
main();

Ожидаемый результат

Когда вы запустите код, выходные данные должны выглядеть следующим образом:

[
    {
        title: 'Does the Sun Also Rise?',
        author: 'Ernst Doubtingway',
        rating: '★★★★☆',
        price: '$9.95'
    },
    {
        title: 'The Insiders',
        author: 'E. S. Hilton',
        rating: '★★★★☆',
        price: '$9.95'
    },
    {
        title: 'A Citrussy Clock',
        author: 'Bethany Urges',
        rating: '★★★★★',
        price: '$9.95'
    }
]

Еще один пример использования Puppeteer

Помимо сбора данных с веб-страниц, Puppeteer можно использовать для различных задач автоматизации. Одним из распространенных вариантов использования является создание PDF-файла веб-страницы. Давайте рассмотрим пример, где Puppeteer используется для создания PDF-файла с веб-страницы.

Создание PDF-файла с помощью Puppeteer

Шаг 1. Импортируйте Puppeteer и создайте асинхронную функцию

const puppeteer = require('puppeteer');

async function generatePDF() {
    // Launch a headless browser instance
    const browser = await puppeteer.launch({ headless: true });

    // Create a new page object
    const page = await browser.newPage();

    // Navigate to the target URL
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    // Generate a PDF from the web page
    await page.pdf({
        path: 'example.pdf', // Output file path
        format: 'A4',        // Paper format
        printBackground: true, // Include background graphics
    });

    // Close the page and browser respectively
    await page.close();
    await browser.close();
}

// Run the function to generate the PDF
generatePDF();

Дополнительные возможности Кукловода

Puppeteer предоставляет несколько вариантов создания PDF-файлов, которые можно настроить в соответствии с вашими потребностями. Вот некоторые из вариантов, которые вы можете использовать:

  • path: Путь к файлу для сохранения PDF.
  • format: формат бумаги (например, «A4», «Letter»).
  • printBackground: включать ли фоновую графику.
  • landscape: Установлен в true для альбомной ориентации.
  • margin: укажите поля для PDF-файла (сверху, справа, снизу, слева).

Пример с дополнительными опциями:

const puppeteer = require('puppeteer');

async function generatePDF() {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    await page.pdf({
        path: 'example.pdf',
        format: 'A4',
        printBackground: true,
        landscape: true,
        margin: {
            top: '20px',
            right: '20px',
            bottom: '20px',
            left: '20px',
        },
    });

    await page.close();
    await browser.close();
}

generatePDF();

Пример вывода

Запуск приведенного выше кода создаст PDF-файл с именем example.pdf в текущем каталоге с содержимым веб-страницы https://example.com.

Puppeteer — это универсальный инструмент для задач веб-автоматизации, от сбора данных до создания PDF-файлов. Простота использования и мощные функции делают его отличным выбором для автоматизации широкого спектра действий в браузере. Независимо от того, собираете ли вы данные, создаете отчеты или тестируете веб-страницы, Puppeteer предоставляет инструменты, необходимые для эффективного выполнения работы.

Логотип Селена

Селен

Селен — это инструмент комплексного тестирования и веб-автоматизации с открытым исходным кодом, часто используемый для очистки веб-страниц. Его основные компоненты включают Selenium IDE, Selenium WebDriver и Selenium Grid.

  • Селен IDE: используется для записи действий перед их автоматизацией.
  • Селен ВебДрайвер: выполняет команды в браузере.
  • Селеновая сетка: Включает параллельное выполнение.

Преимущества селена

  • Простота использования: Простой и понятный в использовании.
  • Языковая поддержка: поддерживает различные языки программирования, такие как Python, Java, JavaScript, Ruby и C#.
  • Автоматизация браузера: может автоматизировать такие браузеры, как Firefox, Edge, Safari и даже пользовательские браузеры QtWebKit.
  • Масштабируемость: Возможно масштабирование Selenium до сотен экземпляров с использованием облачных серверов с различными настройками браузера.
  • Кроссплатформенность: работает в Windows, macOS и Linux.

Недостатки селена

  • Сложная установка: Методы настройки Selenium могут быть сложными.

Пример парсинга веб-страниц с помощью Selenium

Как и в случае с Puppeteer, давайте пройдемся по парсингу веб-страниц с помощью Selenium, используя тот же целевой сайт. Мы возьмем превью книг из категории «Криминалы и триллеры» на сайте Danube.

Магазин «Дунай»: криминал и триллеры

Шаг 1. Импортируйте необходимые модули и настройте Selenium

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument("--headless")

Шаг 2. Инициализируйте Chrome WebDriver

driver = webdriver.Chrome(options=options)

Шаг 3. Перейдите на целевой веб-сайт.

time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")

Шаг 4. Нажмите на категорию «Криминалы и триллеры» и извлеките превью книг.

time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")

Шаг 5. Определите функцию для извлечения данных из каждого предварительного просмотра книги

def extract(element):
    title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
    author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
    rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
    price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
    return {"title": title, "author": author, "rating": rating, "price": price}

Шаг 6. Просмотрите предварительный просмотр, извлеките данные и закройте драйвер

extracted_data = []
for element in books:
    data = extract(element)
    extracted_data.append(data)

print(extracted_data)
driver.quit()

Ожидаемый результат

Запуск приведенного выше кода приведет к выводу, аналогичному следующему:

[
    {'title': 'Does the Sun Also Rise?', 'author': 'Ernst Doubtingway', 'rating': '★★★★☆', 'price': '$9.95'},
    {'title': 'The Insiders', 'author': 'E. S. Hilton', 'rating': '★★★★☆', 'price': '$9.95'},
    {'title': 'A Citrussy Clock', 'author': 'Bethany Urges', 'rating': '★★★★★', 'price': '$9.95'}
]

Дополнительный пример Selenium: снимок экрана

Помимо очистки данных, Selenium также можно использовать для создания снимков экрана веб-страниц. Вот пример того, как сделать снимок экрана веб-страницы с помощью Selenium.

Шаг 1. Импортируйте необходимые модули и настройте Selenium

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--headless")

Шаг 2. Инициализируйте Chrome WebDriver

driver = webdriver.Chrome(options=options)

Шаг 3. Перейдите на целевой веб-сайт.

url = "https://example.com"
driver.get(url)

Шаг 4. Сделайте снимок экрана

driver.save_screenshot("example_screenshot.png")

Шаг 5. Закройте драйвер

driver.quit()

Selenium — универсальный инструмент для задач веб-автоматизации, включая очистку веб-страниц и создание снимков экрана. Поддержка нескольких языков программирования и браузеров, а также масштабируемость делают его отличным выбором для различных задач автоматизации. Независимо от того, извлекаете ли вы данные или создаете отчеты, Selenium предоставляет возможности для эффективной автоматизации ваших задач.

Puppeteer против Selenium: сравнение скорости

Puppeteer быстрее, чем Selenium? Ответ — да: Puppeteer обычно работает быстрее, чем Selenium.

Чтобы сравнить скорость Puppeteer и Selenium, мы использовали песочницу Danube-store и запустили представленные выше скрипты 20 раз, усредняя время выполнения.

Тест скорости селена

Мы использовали time модуль на Python для измерения времени выполнения сценария Selenium. Время начала записывалось в начале, а время окончания в конце сценария. Разница между этими временами обеспечивала общую продолжительность выполнения.

Вот полный скрипт, используемый для Selenium:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def extract(element):
    title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
    author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
    rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
    price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
    return {"title": title, "author": author, "rating": rating, "price": price}

# Start the timer
start_time = time.time()

options = webdriver.ChromeOptions()
options.add_argument("--headless")

# Create a new instance of the Chrome driver
driver = webdriver.Chrome(options=options)

url = "https://danube-webshop.herokuapp.com/"
driver.get(url)

# Click on the Crime & Thrillers category
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)

# Extract the book previews
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")

extracted_data = []
for element in books:
    data = extract(element)
    extracted_data.append(data)

print(extracted_data)

# End the timer
end_time = time.time()
print(f"The whole script took: {end_time - start_time:.4f} seconds")

driver.quit()

Тест скорости кукольника

Для сценария Puppeteer мы использовали Date объект для измерения времени выполнения. Время начала записывалось в начале, а время окончания в конце сценария. Разница между этими временами обеспечивала общую продолжительность выполнения.

Вот полный сценарий, используемый для Puppeteer:

const puppeteer = require('puppeteer');

async function main() {
    const start = Date.now();

    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });

    await page.waitForSelector('ul.sidebar-list');

    await Promise.all([
        page.waitForNavigation(),
        page.click("ul[class='sidebar-list'] > li > a"),
    ]);

    await page.waitForSelector("li[class='preview']");
    const books = await page.evaluateHandle(
        () => [...document.querySelectorAll("li[class='preview']")]
    );

    const processed_data = await page.evaluate(elements => {
        let data = [];
        elements.forEach(element => {
            let title = element.querySelector("div.preview-title").innerHTML;
            let author = element.querySelector("div.preview-author").innerHTML;
            let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
            let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;

            let result = { title, author, rating, price };
            data.push(result);
        });
        return data;
    }, books);

    console.log(processed_data);
    await page.close();
    await browser.close();

    const end = Date.now();
    console.log(`Execution time: ${(end - start) / 1000} seconds`);
}

main();

Результаты теста производительности

Тесты производительности показали, что Puppeteer примерно на 60% быстрее, чем Selenium. Это преимущество в скорости делает Puppeteer более подходящим выбором для проектов, требующих высокоскоростного парсинга и автоматизации веб-страниц, особенно при работе с браузерами на базе Chromium.

Сводка результатов по скорости:

Кукловод против теста скорости Selenium

На диаграмме ниже показана разница в производительности между Puppeteer и Selenium:

Масштабирование приложений Puppeteer для проектов, требующих быстрого и эффективного парсинга веб-страниц, является оптимальным выбором в этом контексте.

Puppeteer против Selenium: что лучше?

Так какой из них лучше для парсинга между Selenium и Puppeteer? Прямого ответа на этот вопрос нет, поскольку он зависит от множества факторов, таких как долгосрочная поддержка библиотеки, кросс-браузерная поддержка и ваши потребности в очистке веб-страниц.

Puppeteer быстрее, но по сравнению с Selenium поддерживает меньше браузеров. Selenium также поддерживает больше языков программирования по сравнению с Puppeteer.

Заключение

Хотя использование Puppeteer или Selenium является хорошим вариантом для парсинга веб-страниц, масштабирование и оптимизация вашего проекта парсинга веб-страниц может оказаться сложной задачей, поскольку расширенные меры защиты от ботов могут обнаружить и заблокировать эти библиотеки. Лучший способ избежать этого — использовать API веб-скрапинга, например OneProxy.

Использование Puppeteer с прокси-серверами

Чтобы использовать Puppeteer с прокси-сервером, вы можете передать настройки прокси в args опция при запуске экземпляра браузера. Вот пример:

const puppeteer = require('puppeteer');

async function main() {
    const proxyServer = 'http://your-proxy-server:port';
    
    const browser = await puppeteer.launch({
        headless: true,
        args: [`--proxy-server=${proxyServer}`]
    });

    const page = await browser.newPage();
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    // Perform your web scraping tasks here

    await browser.close();
}

main();

Использование Selenium с прокси-серверами

Чтобы использовать Selenium с прокси-сервером, вы можете установить параметры прокси, используя webdriver.Proxy сорт. Вот пример:

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "your-proxy-server:port"
proxy.ssl_proxy = "your-proxy-server:port"

capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)

options = webdriver.ChromeOptions()
options.add_argument("--headless")

driver = webdriver.Chrome(desired_capabilities=capabilities, options=options)
driver.get("https://example.com")

# Perform your web scraping tasks here

driver.quit()

Использование прокси-серверов с Puppeteer и Selenium может помочь обойти ограничения на основе IP и снизить риск блокировки, повышая эффективность ваших задач по очистке веб-страниц. Ротационные прокси OneProxy может дополнительно оптимизировать этот процесс, обеспечивая беспрепятственный процесс парсинга.

Часто задаваемые вопросы (FAQ)

Puppeteer и Selenium — это платформы автоматизации браузера, используемые для очистки веб-страниц, тестирования и автоматизации задач браузера. Puppeteer — это библиотека Node.js, которая управляет Chrome или Chromium через протокол DevTools, а Selenium — это инструмент с открытым исходным кодом, который поддерживает различные браузеры и языки программирования через свой API WebDriver.

Puppeteer обычно быстрее Selenium. Однако разница в скорости может варьироваться в зависимости от конкретных задач и конфигураций, используемых в ваших проектах очистки веб-страниц или проектов автоматизации.

Puppeteer известен своей простотой использования, скоростью и способностью по умолчанию автоматизировать задачи в безголовом режиме. Он поддерживает Chromium и имеет мощную событийно-ориентированную архитектуру, которая устраняет необходимость ручного вызова режима сна в коде.

Puppeteer поддерживает меньше браузеров по сравнению с Selenium и в первую очередь фокусируется на JavaScript, хотя существуют неофициальные порты для других языков, таких как Python и PHP.

Вы можете настроить Puppeteer на использование прокси-сервера, передав настройки прокси в файле args опция при запуске браузера.

Selenium поддерживает несколько языков программирования (Python, Java, JavaScript, Ruby, C#) и может автоматизировать различные браузеры, включая Firefox, Edge, Safari и пользовательские браузеры, такие как QtWebKit. Он также обеспечивает широкую масштабируемость с помощью таких методов, как настройка облачных серверов с различными настройками браузера.

Selenium может быть более сложным в настройке по сравнению с Puppeteer, особенно при настройке его для разных браузеров и сред.

Вы можете настроить прокси-сервер в Selenium, используя команду webdriver.Proxy сорт.

Мы выполнили те же задачи по парсингу веб-страниц в песочнице магазина Danube, используя как Puppeteer, так и Selenium. Каждый скрипт выполнялся 20 раз, и для сравнения производительности рассчитывалось среднее время выполнения.

Результаты показали, что Puppeteer примерно на 60% быстрее, чем Selenium, что делает его лучшим выбором для высокоскоростного парсинга веб-страниц и задач автоматизации.

OneProxy может помочь вам избежать блокировки. OneProxy обеспечивает обход защиты от ботов, обеспечивает смену прокси-серверов, автономные браузеры, автоматические повторные попытки и многое другое, обеспечивая бесперебойную работу веб-скрапинга.

ОСТАВИТЬ КОММЕНТАРИЙ

Прокси-серверы для центров обработки данных
Шаред прокси

Огромное количество надежных и быстрых прокси-серверов.

Начинается с$0.06 на IP
Ротационные прокси
Ротационные прокси

Неограниченное количество ротационных прокси с оплатой за запрос.

Начинается с$0.0001 за запрос
Приватные прокси
UDP-прокси

Прокси с поддержкой UDP.

Начинается с$0.4 на IP
Приватные прокси
Приватные прокси

Выделенные прокси для индивидуального использования.

Начинается с$5 на IP
Безлимитные прокси
Безлимитные прокси

Прокси-серверы с неограниченным трафиком.

Начинается с$0.06 на IP
Готовы использовать наши прокси-серверы прямо сейчас?
от $0.06 за IP