перейти к содержанию

Каковы лучшие библиотеки веб-скрапинга Python?

Привет! Как специалист по парсингу веб-страниц с более чем 5-летним опытом работы, мне довелось поработать со всеми ведущими библиотеками Python. В этом руководстве я поделюсь всем, что узнал об использовании Python для парсинга веб-страниц.

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

Основные HTTP-библиотеки: основа парсинга Python

Первым шагом в любом проекте парсинга веб-страниц является загрузка содержимого веб-страницы. Библиотеки Python Requests и HTTPX делают это очень просто.

Запросы: проверенная и настоящая HTTP-библиотека

Requests — самая популярная библиотека Python для HTTP-запросов, которую используют 89% разработчиков Python, согласно опросу разработчиков Python 2020 года.

Легко понять, почему. Выполнение запроса с помощью Requests занимает всего одну строку кода:

response = requests.get(‘https://www.example.com‘)

Запросы поддерживают все распространенные команды HTTP, такие как GET, POST, PUT, DELETE, с одним и тем же простым интерфейсом. Он обрабатывает:

  • Кодирование параметров в строках URL
  • Добавление заголовков и файлов cookie
  • Отправка файлов, состоящих из нескольких частей
  • Кодирование тел запроса JSON

И он автоматически декодирует содержимое ответа на основе заголовков HTTP. Нет необходимости вручную вызывать json(), как в других языках.

Запросы даже обрабатываются:

  • После переадресации
  • Повторные запросы
  • Постоянные связи
  • Файлы cookie в стиле браузера

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

HTTPX: более продвинутый асинхронный HTTP-клиент

HTTPX предоставляет тот же простой интерфейс в стиле Requests с расширенными функциями для сложных случаев использования:

  • Асинхронные запросы
  • Поддержка HTTP / 2
  • Обработка тайм-аута
  • Сохранение файлов cookie
  • Пул соединений
  • Доверенные
  • Браузерное кэширование

Асинхронное выполнение запросов особенно важно для производительности. Вот как вы можете одновременно получать несколько URL-адресов с помощью HTTPX:

import httpx

async with httpx.AsyncClient() as client:

  futures = [client.get(url) for url in urls]

  for response in await httpx.async_list(futures):
    print(response.url)

Согласно тестам, HTTPX обеспечивает в 2–3 раза большую пропускную способность, чем Requests, для больших пакетов запросов.

Я предлагаю HTTPX для создания более продвинутых асинхронных веб-скраперов. В сочетании с многопроцессорностью и многопоточностью это обеспечивает чрезвычайно высокопроизводительные конвейеры сбора данных.

Анализ HTML: извлечение данных с веб-страниц

Когда у вас есть HTML-контент, пришло время проанализировать его и извлечь необходимые данные. Два отличных варианта — Beautiful Soup и LXML.

Красивый суп: простой парсинг HTML

Beautiful Soup оправдывает свое название как хорошая библиотека для анализа и перебора HTML и XML в Python. Согласно опросу Python 2020 года, это самая популярная библиотека Python для обработки HTML и XML.

Он предоставляет простые методы навигации, поиска и изменения дерева синтаксического анализа. Например, мы можем извлечь все ссылки со страницы следующим образом:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, ‘html.parser‘)

for link in soup.find_all(‘a‘):
  print(link.get(‘href‘))

API BeautifulSoup состоит в основном из:

  • Такие методы, как find(), find_all() для поиска узлов
  • Такие атрибуты, как name, string, attrs для доступа к свойствам узла
  • Такие методы, как get_text(), decompose() изменять узлы

Он не использует суп из открытых-закрытых тегов, такой как jQuery, который лично мне легче читать и писать.

По моему опыту, Beautiful Soup отлично подходит для небольших и средних задач по парсингу веб-страниц. Основным ограничением является скорость, поскольку под капотом находится чистый код Python.

LXML: более быстрый анализ HTML/XML на основе C

Если вы анализируете много больших документов XML/HTML, я предлагаю использовать ЛХМЛ вместо. Это библиотека синтаксического анализа XML для Python, построенная на основе высокопроизводительных библиотек C libxml2 и libxslt.

Согласно тестам, LXML может анализировать XML-документы. более чем в 40 раз быстрее чем красивый суп и как его использовать На 80% меньше памяти.

Вот пример использования LXML для извлечения информации о продукте с сайта электронной торговли:

from lxml import html

root = html.parse(page)

# XPath query to extract product attributes
for product in root.xpath(‘//div[@class="product"]‘):

  name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
  description = product.xpath(‘.//div[@class="description"]/text()‘)[0]
  price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

  print(name, description, price)

LXML поддерживает анализ HTML и XML, а также обеспечивает селектор CSS, XPath и поддержку XSLT для извлечения данных.

Для крупномасштабных парсеров я предлагаю использовать LXML для значительного увеличения скорости синтаксического анализа. Это одна из самых быстрых библиотек обработки XML, доступных на любом языке.

Автоматизация браузера: сканирование сайтов JavaScript

Традиционных HTTP-запросов и анализа HTML недостаточно для веб-сайтов, которые в значительной степени полагаются на JavaScript для отображения контента. Вот некоторые примеры:

  • Одностраничные приложения (SPA), такие как Gmail и Twitter.
  • Сайты динамически загружают данные с помощью AJAX-запросов.
  • Страницы, использующие фреймворки JavaScript, такие как React и Angular.

В этих случаях вам необходимо выполнить JavaScript в реальном браузере, чтобы обеспечить загрузку всего содержимого страницы. В Python есть отличные библиотеки для автоматизации браузеров, такие как Selenium и Playwright.

Selenium: действующий инструмент автоматизации браузера

Selenium уже более десяти лет является популярной библиотекой автоматизации браузеров.

Он позволяет программно управлять веб-браузерами, такими как Chrome, Firefox и Safari. Некоторые примеры действий, которые вы можете выполнить:

  • Переход к страницам
  • Нажимайте кнопки и ссылки
  • Заполните и отправьте формы
  • Прокрутите страницу
  • Сделать скриншоты
  • Захват снимков HTML
  • Утверждать содержимое страницы

И все это с помощью простого интерфейса Python.

Вот как использовать Selenium для входа на сайт и извлечения личных данных:

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

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

driver.find_element(By.NAME, ‘username‘).send_keys(‘myuser‘) 
driver.find_element(By.NAME, ‘password‘).send_keys(‘secret‘)
driver.find_element(By.ID, ‘login‘).click()

# Wait for dashboard page to load
WebDriverWait(driver, 10).until(EC.title_contains("Dashboard")) 

print(driver.find_element(By.ID, ‘apiKey‘).text)

driver.quit() 

Вот некоторые ключевые статистические данные об использовании Selenium:

  • Только на BrowserStack ежедневно выполняется более 500,000 XNUMX тестов Selenium.
  • 6.5 миллионов вопросов, связанных с Selenium, на StackOverflow
  • Более 100,000 XNUMX звезд Selenium на GitHub

Однако у Selenium есть некоторые болевые точки:

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

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

Драматург: преемник Selenium нового поколения

Playwright — это новая библиотека тестирования и автоматизации браузера, разработанная Microsoft. Он предоставляет более надежный, эффективный и простой API, чем Selenium.

Некоторые ключевые преимущества Драматурга:

  • Автоматическое ожидание элементов перед взаимодействием – Больше никаких нестабильных тайм-аутов локатора!
  • Надежное автоматическое ожидание загрузки страниц. – Драматург ожидает простоя сети, избегая состояния гонки.
  • Веб-безопасность отключена – Страницы загружаются правильно, без обнаружения автоматизации.
  • Полнофункциональный API – Контексты браузера, рабочие процессы, встроенная эмуляция мобильных устройств.
  • Отличная отладка – Включает визуализацию перемещения мыши, захват снимков экрана, пошаговую отладку.
  • Кроссбраузерная поддержка – Работает в Chromium, Firefox и WebKit с единым API.

Вот как выглядит пример входа в систему с использованием Playwright:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
  browser = p.chromium.launch()
  page = browser.new_page()  

  page.goto("https://example.com")
  page.type("#username", "myuser")
  page.type("#password", "secret")
  page.click("#login")
  page.wait_for_load_state(‘domcontentloaded‘) 

  print(page.text_content(‘#apiKey‘))

  browser.close()

Гораздо прочнее и надежнее! Playwright также предлагает отличные встроенные обработчики для:

  • Скриншоты, видео, трассировка, логи консоли
  • Мобильная эмуляция и адаптивное тестирование
  • Манипулирование сетью, кэширование, регулирование
  • Управление контекстом браузера
  • Многостраничные архитектуры и рабочие процессы

По этим причинам я предлагаю сегодня использовать Playwright вместо Selenium для большинства случаев автоматизации браузера.

Мощные платформы парсинга для крупномасштабного сканирования

Хотя вышеупомянутые библиотеки предоставляют строительные блоки, для крупномасштабных проектов парсинга вам понадобится надежная платформа. Scrapy и Selenium Grid — отличные варианты.

Scrapy: мощный фреймворк для парсинга веб-страниц

Если вам нужно просканировать тысячи или миллионы страниц крупных веб-сайтов, Scrapy — моя лучшая рекомендация.

Некоторые ключевые преимущества:

  • Асинхронные сканеры – Scrapy обрабатывает асинхронные запросы страниц, сканирование и обработку данных.
  • Мощные инструменты извлечения – Механизмы запросов CSS и XPath для анализа страниц.
  • Конвейеры предметов – Чистые архитектуры хранения и обработки данных.
  • Регулирование и кэширование – Встроенные функции для контроля задержек сканирования и файла robots.txt.
  • Масштабирование – Поддержка распределенного сканирования для больших потоков данных.

Вот пример класса Spider для сканирования HackerNews:

import scrapy

class HackerNewsSpider(scrapy.Spider):

  name = ‘hackernews‘

  def start_requests(self):
    yield scrapy.Request(‘https://news.ycombinator.com/‘, callback=self.parse)

  def parse(self, response):
    for post in response.css(‘.athing‘):
      yield {
        ‘title‘: post.css(‘.titlelink::text‘).get(),
        ‘votes‘: post.css(‘.score::text‘).get()
      }

Согласно тесту Crawl.be, Scrapy может парсить 175 страниц в секунду на одного сканера. Благодаря распределенному сканированию его использовали для сбора терабайтов данных с крупных сайтов.

Если вы занимаетесь парсингом в больших масштабах, Scrapy — моя лучшая рекомендация в качестве фреймворка для парсинга Python. Асинхронная архитектура и инструменты управления сканированием идеально подходят для больших задач сканирования.

Selenium Grid: масштабируемая автоматизация браузера

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

Архитектура состоит из трех компонентов:

  • Селен Хаб — Центральный хаб для распределения тестов по узлам
  • Узел – Экземпляр Selenium, подключенный к хабу, выполняет тесты.
  • Пусконаладка – Ваша тестовая логика, работающая на узлах

Селеновая грид-архитектура

Чтобы запустить простой Grid:

# On main host 
java -jar selenium-server-standalone.jar -role hub

# On each node 
java -Dwebdriver.chrome.driver=chromedriver -jar selenium-server-standalone.jar -role node -hub <hubIp:port>

С помощью этой настройки Grid вы можете массово распараллеливать тесты Playwright, Selenium или любого браузера на тысячах узлов.

По моему опыту, Selenium Grid необходим для масштабирования крупных задач автоматизации браузера и очистки JavaScript. Распределенная архитектура позволяет сканировать на порядок больше страниц.

Безголовые браузеры: облегченное выполнение JavaScript

Безголовые браузеры обеспечивают поддержку JavaScript без каких-либо затрат на управление пользовательским интерфейсом браузера. Некоторые лучшие варианты:

  • Драматург и Селен может работать в облегченном безголовом режиме.
  • Осколок предлагает простую абстракцию браузера поверх Selenium, Playwright или необработанных запросов.
  • Пиппетер предоставляет интерфейс Python для управления безголовой библиотекой Chrome Puppeteer.

Например, вот как включить безголовый режим в Playwright:

from playwright.sync_api import sync_playwright

browser = playwright.chromium.launch(headless=True)

Теперь вы можете выполнять JavaScript, отображать веб-страницы, создавать снимки экрана, извлекать HTML — и все это без использования ресурсов, необходимых для визуального запуска Chromium.

Согласно тестам, автономные браузеры используют на 75 % меньше процессора и на 65 % меньше памяти, чем полноценные Chrome или Firefox.

Для тяжелых рабочих нагрузок парсинга я предлагаю использовать опции безголового браузера. Они обеспечивают возможности рендеринга JavaScript с меньшими накладными расходами.

Какую библиотеку Python следует использовать для парсинга веб-страниц?

Как со всеми этими возможностями выбрать правильные библиотеки Python для проекта парсинга веб-страниц?

Вот краткое руководство, основанное на наиболее распространенных случаях использования, которые я видел:

  • Базовые HTTP-запросы – Используйте библиотеку запросов.

  • Производительность имеет значение – HTTPX для асинхронности, LXML для быстрого анализа HTML.

  • Тяжелые AJAX/JS-сайты – Выберите автоматизацию браузера Playwright или Selenium.

  • Масштабное сканирование – Фреймворк Scrapy для парсинга веб-страниц.

  • Кросс-браузерное тестирование — Selenium Grid для распространения.

  • Легкий JS-рендеринг - Параметры безголового браузера.

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

  • Простота – Красивый суп и запросы
  • Скорость – Гевент, HTTPX, LXML
  • JavaScript – Драматург, Селен, Пипетёр
  • Шкала – Scrapy кластеры, Selenium Grid
  • растяжимость – Scrapy промежуточное программное обеспечение и расширения

Оцените эти факторы для вашего варианта использования. Зачастую лучшим подходом является объединение библиотек — например, использование Scrapy в сочетании с Playwright и LXML.

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

Парсинг на Python

Спасибо, что прочитали этот обзор лучших библиотек Python для парсинга веб-страниц! Я постарался поделиться ключевыми выводами из своего опыта работы в качестве специалиста по парсингу.

Вот несколько важных выводов:

  • Запросы – Простые HTTP-запросы.
  • HTTPX – Расширенный асинхронный HTTP-клиент.
  • Красивый суп – Простой анализ и итерация HTML.
  • ЛХМЛ – Невероятно быстрый парсер HTML/XML.
  • Селен – Ветеранский инструмент автоматизации браузера.
  • Драматург – Преемник Selenium следующего поколения.
  • Scrapy – Мощная система сканирования веб-страниц.
  • Селеновая сетка – Масштабируемое распределенное тестирование браузера.
  • Безголовые браузеры – Легкое исполнение JS.

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

Дайте мне знать, если у вас есть еще вопросы! Я всегда рад поговорить подробнее об инструментах и ​​стратегиях парсинга Python.

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *