Ви намагаєтеся вибрати між Puppeteer і Selenium для веб-збирання? Обидва є потужними фреймворками для автоматизації браузера, і правильний вибір залежить від ваших конкретних потреб у копіюванні та наявних ресурсів.
Щоб допомогти вам прийняти зважене рішення, ми виділили ключові відмінності між Puppeteer і Selenium у таблиці нижче. Після цього ми заглибимося в деталі та надамо приклад копіювання для кожного фреймворку, щоб продемонструвати їх ефективність у вилученні даних із веб-сторінок.
Критерії | Ляльковод | Селен |
---|---|---|
Сумісні мови | Офіційно підтримується лише JavaScript, але є неофіційні порти PHP і Python | Java, Python, C#, Ruby, PHP, JavaScript і Kotlin |
Підтримка браузера | Підтримка Chromium і експериментальний Firefox | Chrome, Safari, Firefox, Opera, Edge та Internet Explorer |
Продуктивність | 60% швидше, ніж Selenium | швидко |
Підтримка операційної системи | Windows, Linux і macOS | Windows, 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 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 для проектів, які вимагають швидкого та ефективного веб-збирання, є оптимальним вибором у цьому контексті.
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, що змінюються може ще більше оптимізувати цей процес, забезпечуючи безперебійне очищення.