Парсинг данных с сайтов конкурентов или даже со своих собственных сайтов можно организовать несколькими способами: на базе готовых решений (это могут быть программы-парсеры, устанавливаемые на ваш ПК или на сервер, а могут быть и готовые облачные сервисы с API), на базе тематических срезов (это готовые данные, которые можно приобрести у специальных провайдеров), на базе собственного ПО.
Написание своего парсера – это всегда сложно, дорого и требует определённого уровня подготовки. Но иногда это единственно возможный выход, так как готовые решения не подходят под определённые требования и задачи.
Ускорить процесс создания программы-парсера можно за счёт специальных библиотек. Для работы с данными чаще всего используется язык Python и потому именно на нём можно встретить больше всего библиотек и модулей для парсинга.
Ниже расскажем о лучших Python-библиотеках для парсинга сайтов.
Почему Python-библиотеки так важны для парсинга?
Парсинг (в английском языке используется термин scraping) – это преобразование одних данных в другие, из неструктурированных или неподходящих в структурированные и подходящие. Что такое парсинг, мы рассказывали отдельно. Плюс, поясняли в чём разница между Web Crawling и Web Scraping.
А ещё мы показывали лучшие инструменты для парсинга Амазон и сникер-ботов для мониторинга цен на брендовые кроссовки.
Всё это программы, которые сканируют код web-страниц, выявляют на них нужную информацию и записывают её в таблицы (в базы данных).
Язык программирования Python – это один из самых популярных язык программирования. На всякий случай статистика GitHub за 2022 год. Питон занимает в рейтинге первое место с внушительным отрывом от остальных.
Программисты знают, что Python лучше других подходит для анализа данных, для машинного обучения, для DevOps, а также для многих других задач. Но сейчас нас интересуют именно данные. Чтобы реализовать очистку, анализ и обработку информации на Python достаточно написать буквально несколько строк кода. Ни один другой язык программирования таким похвастаться не может.
Но всё это было бы невозможно, если бы не подключаемые библиотеки и модули. Именно они отвечают за автоматизацию большей части рутины. Но анализ данных и парсинг – это разные задачи. Здесь уже не помогут штатные библиотеки, такие как pandas, NumPy и т.п., потребуются дополнительные наработки. О них мы и расскажем ниже.
Ключевое преимущество готовых библиотек состоит в том, что разработчику не нужно писать код с нуля и придумывать свой «велосипед». Библиотека – это как набор готовых блоков, из которых можно относительно быстро и безболезненно собрать свою программу, у которой будет уникальный набор свойств – именно тех, которые от неё и требуются.
Лучшие Python-библиотеки для парсинга
Библиотека BeautifulSoup
Beautiful Soup («Красивый суп») – это одна из лучших библиотек Python для быстрого создания кастомных парсеров. Разрабатывается с 2004 года, базируется на мощных анализаторах синтаксиса, таких как lxml и html5lib.
Проект сопровождается командой Crummy и Леонардом Ричардсоном в частности. Та же команда предлагает большое количество других библиотек, скриптов и даже игр. Есть даже своя система публикации и ведения блогов.
Для предприятий предлагается отдельная версия BeautifulSoup, которая распространяется по модели подписки и включает официальную техническую поддержку.
Преимущества BeautifulSoup:
- Готовые методы и идиомы Pythonic для поиска по дереву синтаксического анализа.
- Комплексный набор инструментов для извлечения данных из HTML-страниц и документов.
- Для написания своих скриптов потребуется минимум программного кода.
- Входящие документы (данные) автоматически конвертируются в Unicode, а исходящие – в UTF-8 (не нужно заботиться о кодировке).
- Очень простой и понятный синтаксис, который можно углублять и детализировать по мере необходимости. Например, можно просто найти все ссылки в документе, а можно попросить собрать только ссылки, указывающий на определённый домен, с конкретным именем CSS-класса, и т.п.
- Полная совместимость с Python 3 (поддержка Python 2 прекращена в 2021 году).
- Beautiful Soup распространяется по лицензии MIT (можно использовать совершенно бесплатно).
- Библиотека регулярно обновляется и актуализируется.
Установка Beautiful Soup
Из среды Python библиотеку можно установить командой:
pip install beautifulsoup4
Непосредственно в коде библиотека импортируется командой:
from bs4 import BeautifulSoup
Простейший пример использования:
soup = BeautifulSoup(page.text, "html.parser")
print(soup)
Будет выведен весь HTML-код страницы page.text
Для дистрибутивов на базе Debian и Ubuntu можно установить пакет python3-bs4 из официального репозитория. В Fedora по аналогии предоставляется пакет python3-beautifulsoup4.
Библиотека Requests
Requests («Запросы») – это продвинутая замена для штатной библиотеки Python urllib, предназначенной для обработки HTTP-запросов. В отличие от системной библиотеки, Requests позволяет получать те же результаты, но с меньшими усилиями и объёмом кода.
Requests не используется как самостоятельный парсер-скрипт, но она является важной составляющей при работе со структурами URL-адресов и при получении данных. Наверное, по этой причине от библиотеки зависит более 1 млн. репозиториев на GitHub.
Преимущества Requests:
- Простая обработка международных доменов.
- Поддержка анализа кодов состояния (ответов сервера).
- Данные из ответа сервера можно получать в чистом виде, а можно конвертировать в строки. При этом кодировка автоматически устанавливается в UTF-8 (при желании её можно изменить на своё значение).
- Ответ автоматически сериализуется по формату JSON (удобно использовать в других вызовах и функциях).
- Адекватная работа с SSL-сертификатами (поддержка HTTPS-протокола).
- Возможность авторизации на целевом сайте (ввод логина и пароля).
- Полная поддержка web-сессий и файлов cookies.
- Автоматическая декомпрессия содержимого.
- Поддержка HTTP-прокси.
- Частичные запросы и загрузка файлов.
Установка Requests
В среде Python установка библиотеки осуществляется командой:
pip install requests
Подключение в коде:
import requests
Простейший пример с получением данных со страницы:
data = requests.get('https://your-site.com')
data.content
print(data)
Через Requests можно получать ответы сервера, заголовки страниц и многие другие данные. Плюс, библиотека поддерживает все необходимые методы: GET, POST, PUT, DELETE, HEAD и OPTIONS.
Обратите внимание, библиотека Requests не работает со страницами, написанными на JavaScript.
Фреймворк Scrapy
Scrapy – это крутой Python-фреймворк (готовая платформа), обеспечивающий быстрое создание асинхронных парсеров данных с веб-сайтов. Написан на базе библиотеки Twisted (именно она даёт ту самую асинхронность). Разработка Scrapy ведётся с 2008 года. Это продукт с открытым исходным кодом, который используется в нескольких десятках крупных интернет-проектов (не только онлайн-платформы парсинга, но и различные статистические агентства, государственные структуры, системы машинного обучения и т.п.).
В комплекте Scrapy есть всё, что может понадобиться для работы с данными: планировщик, системы экспорта, отладка, командная строка, различные загрузчики контента, готовое API и т.п. Это настоящий мега-комбайн, к которому остаётся только «прикрутить» свой интерфейс. При желании можно детально настроить Scrapy на уровне исходного кода.
Преимущества Scrapy:
- Это полностью готовая реализация web-парсера (Python scraper), плюс, фреймворк/конструктор для сборки своей программы.
- Поддерживается асинхронная модель парсинга, которая позволяет одновременно обрабатывать огромные массивы данных.
- Готовая система экспортирования данных в наиболее востребованных форматах (XML, JSON, CSV).
- Своя система аддонов, расширений и компонентов. Есть готовое API.
- Поддержка расписания и очереди парсинга.
- Работа с прокси и тонкая настройка ограничений по запросам (скорости сканирования).
- Всё для отладки и контроля утечек памяти.
- Встроенные медиаконвейры (для работы с файлами, изображениями и видео). Файлы можно выгружать на любые внешние хранилища – FTP, частные облака, S3-хранилища, локальные диски.
- Возможность интеграции с BeautifulSoup и LXML.
Установка Scrapy
Из-за большого объёма кода и высокой самодостаточности фреймворка (фактически это работоспособное приложение с консольным интерфейсом), Scrapy рекомендуется устанавливать в выделенной виртуальной среде.
Классическая установка выглядит так:
pip install Scrapy
Но если вам нужна самая актуальная версия фреймворка, можно использовать установщики Anaconda или Miniconda с каналом conda-forge:
conda install -c conda-forge scrapy
Разработчики не рекомендуют установку из Ubuntu/Debian пакетов (python-scrapy), так как в них обычно содержится устаревшая версия фреймворка.
Чтобы начать работать со Scrapy, нужно сначала создать новый проект:
scrapy startproject project1
После команды будет создан каталог «project1» с определённым наполнением и структурой.
В подпапке spiders нужно создать нового паука (файл с именем «имя_вашего_паука_spider.py») и добавить в него все необходимые настройки. Как это сделать, лучше всего почитать в официальной документации. Пауки Scrapy – это подклассы для класса scrapy.Spider.
Запускается сканирование командой:
scrapy crawl имя_вашего_паука
Вместо программного вызова можно использовать shell-оболочку:
scrapy shell 'https://your-site.com/page/1/'
Например, строка
response.css("h2").getall()
выведет все заголовки второго уровня на странице.
Обратите внимание! Без компонента Selenium Scrapy не умеет работать с сайтами, написанными на JavaScript.
Компоненты Selenium
Selenium – это набор инструментов и утилит автоматизации, обеспечивающих взаимодействие с движками браузеров. Они необходимы для поддержки некоторых важных технологий, таких как JavaScript и асинхронный AJAX.
JavaScript подразумевает загрузку и исполнение скриптов только внутри браузера, итоговый HTML нельзя получить напрямую от сервера. Соответственно никак не получится распарсить его на составляющие компоненты и теги. А это большая проблема, так как всё больше и больше сайтов, включая современные web-приложения, работают с технологией JavaScript.
Несмотря на то, что Selenium представлен несколькими разрозненными компонентами (web-драйвер, IDE-система, библиотеки, фреймворк и API), фактически это библиотека пользовательского агента браузера.
Преимущества Selenium
- Парсинг HTML Java (JavaScript).
- Функции автоматизации тестирования кода в разных браузерах (с созданием скриншотов и поддержкой всех современных платформ – Chrome, Firefox, Safari, Opera и Microsoft Edge).
- Возможность создания сложных сценариев, даже с эмулированием поведения пользователя.
- Поддержка разных языков программирования (конечно, есть и Python).
- Готовые библиотеки для подключения к Scrapy и BeautifulSoup
Установка Selenium
Команда установки через PIP более чем стандартная:
pip install selenium
А вот подключение и использование в коде парсера будет заметно сложнее. Пример с использованием браузера Chrome:
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
Чтобы получить возможность управления браузером Хром, понадобится web-драйвер. Скачать его можно отсюда.
Примерный вызов web-драйвера:
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
path = "Путь\до\chromedriver.exe"
driver = webdriver.Chrome(path, options = options)
driver.get(link)
Вот так будет выглядеть работа модуля для Scrapy:
pip install scrapy-selenium
from shutil import which
Подключение и конфигурация в коде:
SELENIUM_DRIVER_NAME = 'firefox'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')
SELENIUM_DRIVER_ARGUMENTS=['-headless']
Вместо штатного метода request Scrapy нужно определить метод из Селена:
from scrapy_selenium import SeleniumRequest
yield SeleniumRequest(url=url, callback=self.parse_result)
Пример вызова:
def parse_result(self, response):
print(response.request.meta['driver'].title)
Библиотека Urllib3
Urllib3 – это ещё популярная библиотека Python, которую часто используют для web-скрапинга. Она отвечает за получение и обработку URL-запросов, с её помощью можно извлекать определённую информацию из ответов сервера, фактически это лёгкий и мощный HTTP-клиент для Python.
У утилиты есть версия с официальной платной поддержкой для юридических лиц, которая доступна в единой подписке Tidelift. Не стоит путать Urllib3 и просто urllib, последняя является штатной библиотекой Python.
Преимущества Urllib3
- Безопасная работа с большим пулом соединений.
- Возможность проверки TLS/SSL на стороне клиента.
- Загрузка данных с разными кодировками.
- Поддержка разных форматов сжатия web-страниц (ответов сервера).
- Работа со списками HTTP(S) и SOCKS-прокси.
- Максимально простой синтаксис и минимум кода.
- Поддержка https-протокола.
Установка Urllib3
Команда для установщика PIP:
pip install urllib3
Подключение библиотеки в коде:
import urllib3
Пример исполняемого кода:
http = urllib3.PoolManager()
resp = http.request("GET", "https://your-site.com/page/")
print(resp.json())
В этом случае данные будут выведены в JSON-формате.
Обратите внимание! Задача Urllib3 – получение данных со страниц. Urllib3 не имеет средств для разбора (парсинга) этих данных, но библиотека может использоваться в паре с любым из парсеров, обозначенных выше.
Библиотека LXML
LXML – это многофункциональная библиотека Python, позволяющая производить обработку и генерацию XML-данных на HTML-страницах. LXML – это Pythonic-привязка для библиотек libxml2 и libxslt.
LXML подходит для синтаксического анализа содержимого и может сочетаться с другими библиотеками парсеров, например, с BeautifulSoup или со Scrapy.
Преимущества LXML
- Библиотека распространяется через репозиторий пакетов Python PyPI.
- Благодаря вкраплениям на языке C, LXML обеспечивает максимально высокое быстродействие.
- Предоставляется сразу два варианта API (на основе etree и на основе objectify).
- Из коробки поддерживаются популярные схемы документов (DTD, Relax NG и XML Schema).
Установка LXML
Установка библиотеки стандартная:
pip install lxml
Далее нужно определить схему обработки, например, etree:
from lxml import etree
Для извлечения данных из схемы документа используется метод parser:
root = etree.XML("<root> <a/> <b> </b> </root>", parser)
etree.tostring(root)
Выводы
Мы привели примеры наиболее распространённых библиотек и инструментов с открытым исходным кодом на Python, которые смело можно использовать в своих проектах. Но на GitHub и в других хранилищах кода готовых решений гораздо больше, особенно, если учесть многочисленные форки обозначенных библиотек и парсеров.
Например, в список могли также попасть PySpider, PSF (Pythonic HTML Parsing for Humans), pycparser, autoscraper, grab, MechanicalSoup и другие.
Можно было заметить, что наиболее комплексные профильные инструменты для парсинга умеют работать с целевыми сайтами через сеть из прокси-серверов. Это делается для того, чтобы снизить риски блокировки и увеличить количество параллельных запросов к целевым сайтам.
Арендовать практически безлимитный пул мобильных и резидентных прокси (8+ млн. IP) можно в сервисе Froxy. В наличии API и разные алгоритмы ротации списков, более 200 стран размещения с точностью таргетинга до города, выгрузка в TXT, CSV или HTML-формате.