Puppeteer проти Selenium: що вибрати для веб-збирання?

Виберіть і купіть проксі

Puppeteer проти Selenium: що вибрати для веб-збирання?

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

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

КритеріїЛяльководСелен
Сумісні мовиОфіційно підтримується лише JavaScript, але є неофіційні порти PHP і PythonJava, 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 також можна використовувати для тестування веб-сторінок шляхом імітації взаємодії користувача, як-от натискання кнопок, заповнення форм і перевірка відображених результатів.

Переваги Puppeteer

  • Простота використання: простий і зрозумілий у використанні.
  • У комплекті з Chromium: Додаткове налаштування не потрібно.
  • Безголовий режим: За замовчуванням працює в безголовому режимі, але його можна налаштувати для роботи в повноцінному режимі браузера.
  • Архітектура, керована подіями: усуває потребу в ручних викликах сну у вашому коді.
  • Комплексні можливості: може робити знімки екрана, створювати PDF-файли та автоматизувати всі дії браузера.
  • Управління продуктивністю: пропонує інструменти для запису часу виконання та продуктивності завантаження для оптимізації та налагодження вашого скребка.
  • SPA повзання: здатність сканувати односторінкові програми (SPA) і генерувати попередньо відтворений вміст (візуалізація на стороні сервера).
  • Запис сценарію: дозволяє створювати сценарії Puppeteer шляхом запису дій у браузері за допомогою консолі DevTools.

Недоліки Puppeteer

  • Обмежена підтримка браузера: підтримує менше браузерів порівняно з 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

Селен

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

  • Selenium IDE: використовується для запису дій перед їх автоматизацією.
  • Веб-драйвер Selenium: Виконує команди в браузері.
  • Сітка селену: Вмикає паралельне виконання.

Переваги селену

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

Недоліки селену

  • Комплексне налаштування: Методи налаштування Selenium можуть бути складними.

Зразок веб-збирання з Selenium

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

Дунайська крамниця: кримінал і трилери

Крок 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 разів, усереднюючи час виконання.

Тест швидкості Selenium

Ми використовували 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.

Підсумок результатів швидкості:

Тест швидкості Puppeteer проти 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-store за допомогою 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