Pyppeteer и selenium — это инструменты для автоматизации браузера, которые можно использовать для тестирования, сканирования и управления веб-страницами. Все они поддерживают несколько языков программирования, могут работать на разных платформах и предоставляют богатые API и документацию.
Pyppeteer — это версия Puppeteer для Python, библиотеки на основе Node.js, которая может управлять безголовыми или безголовыми браузерами Chrome или Chromium. Pyppeteer использует библиотеку asyncio для реализации асинхронного программирования, что может повысить производительность и эффективность. Pyppeteer также может использовать преимущества Puppeteer, такие как создание PDF-файлов, снимков экрана, перехват запросов и т. д.
Selenium — более зрелый и широко используемый проект автоматизации браузеров, который может управлять различными браузерами, такими как Chrome, Firefox, Edge и т. д. Selenium соответствует стандарту W3C WebDriver, который позволяет пользователям писать взаимозаменяемый код для адаптации к различным средам браузера. Selenium также предоставляет распределенный сервер под названием Grid, который может параллельно запускать тесты на нескольких машинах.
Основные различия и преимущества между Pyppeteer и селеном заключаются в следующем:
Например, для сбора бизнес-информации и обзоров Meituan используется следующий пример кода с использованием Pyppeteer:
import asyncio
from pyppeteer import launch
import pandas as pd
# Расширенная версия гусеничного агента Yiniu Cloud (агент туннеля динамической пересылки) Установите имя пользователя, пароль, адрес и порт
proxy_user = "16YUN"
proxy_pass = "16IP"
proxy_host = "www.16yun.cn"
proxy_port = "3100"
# Установите URL-адрес и количество страниц для сбора.
url = "https://meishi.meituan.com/i/?ci=1&stid_b=1&cevent=imt%2Fhomepage%2Fcategory1%2F1"
pages = 5
# Определите функцию для получения имени и отзывов каждого продавца.
async def get_info(page):
# Подождите, пока страница загрузится
await page.waitForSelector(".list-ul")
# Получите элементы всех торговцев
shops = await page.querySelectorAll(".list-item")
# Определите пустой список для хранения данных
data = []
# Перебрать каждого продавца
for shop in shops:
# Получить имя продавца
name = await page.evaluate("(element) => element.querySelector('.title').textContent", shop)
# Получить количество отзывов о продавце
comments = await page.evaluate("(element) => element.querySelector('.comment-num').textContent", shop)
# Удалить пробелы и новые строки
name = name.strip()
comments = comments.strip()
# Добавить данные в список
data.append([name, comments])
# Список возвращаемых данных
return data
# Определите функцию для сбора данных с нескольких страниц и сортировки их по категориям.
async def scrape(url, pages):
# Запустите браузер, настройте прокси-сервер и безголовый режим.
browser = await launch({"args": [f"--proxy-server={proxy_host}:{proxy_port}"], "headless": True})
# Создать новую страницу
page = await browser.newPage()
# Установить размер области просмотра страницы
await page.setViewport({"width": 1280, "height": 800})
# URL-адрес посещения
await page.goto(url)
# Введите логин и пароль IP прокси
await page.authenticate({"username": proxy_user, "password": proxy_pass})
# Определите пустой список для хранения всех данных
all_data = []
# Собирайте данные с каждой страницы в цикле
for i in range(pages):
# Вызовите функцию, которая получает информацию, и добавьте возвращаемые данные в общий список.
info = await get_info(page)
all_data.extend(info)
# Если это не последняя страница, нажмите кнопку следующей страницы и подождите, пока страница перейдет.
if i < pages - 1:
next_button = await page.querySelector(".pagination-item.next")
await next_button.click()
await page.waitForNavigation()
# Закрыть браузер
await browser.close()
# Преобразуйте общий список в фрейм данных и задайте имена столбцов.
df = pd.DataFrame(all_data, columns=["name", "comments"])
# Преобразуйте количество комментариев в целочисленный тип и отсортируйте их по убыванию.
df["comments"] = df["comments"].astype(int)
df = df.sort_values(by="comments", ascending=False)
# Сохраните фрейм данных в формате CSV и распечатайте первые 50 строк.
df.to_csv("meituan.csv", index=False)
print(df.head(50))
# Запустите функцию сбора и передайте параметры URL и номера страницы.
asyncio.get_event_loop().run_until_complete(scrape(url, pages))