Вы пытаетесь выбрать между 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 также можно использовать для тестирования веб-страниц, моделируя взаимодействия с пользователем, такие как нажатие кнопок, заполнение форм и проверка отображаемых результатов.
Преимущества компании «Кукловод»
- Простота использования: Простой и понятный в использовании.
- В комплекте с Хромом: Никакой дополнительной настройки не требуется.
- Безголовый режим: по умолчанию запускается в автономном режиме, но его можно настроить для работы в полнофункциональном режиме браузера.
- Событийно-ориентированная архитектура: устраняет необходимость в ручных вызовах сна в вашем коде.
- Комплексные возможности: может делать снимки экрана, создавать 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.
Сводка результатов по скорости:
На диаграмме ниже показана разница в производительности между 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 может дополнительно оптимизировать этот процесс, обеспечивая беспрепятственный процесс парсинга.