Парсинг данных с сайтов конкурентов или даже со своих собственных сайтов можно организовать несколькими способами: на базе готовых решений (это могут быть программы-парсеры, устанавливаемые на ваш ПК или на сервер, а могут быть и готовые облачные сервисы с API), на базе тематических срезов (это готовые данные, которые можно приобрести у специальных провайдеров), на базе собственного ПО.
Написание своего парсера – это всегда сложно, дорого и требует определённого уровня подготовки. Но иногда это единственно возможный выход, так как готовые решения не подходят под определённые требования и задачи.
Ускорить процесс создания программы-парсера можно за счёт специальных библиотек. Для работы с данными чаще всего используется язык Python и потому именно на нём можно встретить больше всего библиотек и модулей для парсинга.
Ниже расскажем о лучших Python-библиотеках для парсинга сайтов.
Парсинг (в английском языке используется термин scraping) – это преобразование одних данных в другие, из неструктурированных или неподходящих в структурированные и подходящие. Что такое парсинг, мы рассказывали отдельно. Плюс, поясняли в чём разница между Web Crawling и Web Scraping.
А ещё мы показывали лучшие инструменты для парсинга Амазон и сникер-ботов для мониторинга цен на брендовые кроссовки.
Всё это программы, которые сканируют код web-страниц, выявляют на них нужную информацию и записывают её в таблицы (в базы данных).
Язык программирования Python – это один из самых популярных язык программирования. На всякий случай статистика GitHub за 2022 год. Питон занимает в рейтинге первое место с внушительным отрывом от остальных.
Программисты знают, что Python лучше других подходит для анализа данных, для машинного обучения, для DevOps, а также для многих других задач. Но сейчас нас интересуют именно данные. Чтобы реализовать очистку, анализ и обработку информации на Python достаточно написать буквально несколько строк кода. Ни один другой язык программирования таким похвастаться не может.
Но всё это было бы невозможно, если бы не подключаемые библиотеки и модули. Именно они отвечают за автоматизацию большей части рутины. Но анализ данных и парсинг – это разные задачи. Здесь уже не помогут штатные библиотеки, такие как pandas, NumPy и т.п., потребуются дополнительные наработки. О них мы и расскажем ниже.
Ключевое преимущество готовых библиотек состоит в том, что разработчику не нужно писать код с нуля и придумывать свой «велосипед». Библиотека – это как набор готовых блоков, из которых можно относительно быстро и безболезненно собрать свою программу, у которой будет уникальный набор свойств – именно тех, которые от неё и требуются.
Beautiful Soup («Красивый суп») – это одна из лучших библиотек Python для быстрого создания кастомных парсеров. Разрабатывается с 2004 года, базируется на мощных анализаторах синтаксиса, таких как lxml и html5lib.
Проект сопровождается командой Crummy и Леонардом Ричардсоном в частности. Та же команда предлагает большое количество других библиотек, скриптов и даже игр. Есть даже своя система публикации и ведения блогов.
Для предприятий предлагается отдельная версия BeautifulSoup, которая распространяется по модели подписки и включает официальную техническую поддержку.
Преимущества BeautifulSoup:
Установка 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 («Запросы») – это продвинутая замена для штатной библиотеки Python urllib, предназначенной для обработки HTTP-запросов. В отличие от системной библиотеки, Requests позволяет получать те же результаты, но с меньшими усилиями и объёмом кода.
Requests не используется как самостоятельный парсер-скрипт, но она является важной составляющей при работе со структурами URL-адресов и при получении данных. Наверное, по этой причине от библиотеки зависит более 1 млн. репозиториев на GitHub.
Преимущества Requests:
Установка 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 – это крутой Python-фреймворк (готовая платформа), обеспечивающий быстрое создание асинхронных парсеров данных с веб-сайтов. Написан на базе библиотеки Twisted (именно она даёт ту самую асинхронность). Разработка Scrapy ведётся с 2008 года. Это продукт с открытым исходным кодом, который используется в нескольких десятках крупных интернет-проектов (не только онлайн-платформы парсинга, но и различные статистические агентства, государственные структуры, системы машинного обучения и т.п.).
В комплекте Scrapy есть всё, что может понадобиться для работы с данными: планировщик, системы экспорта, отладка, командная строка, различные загрузчики контента, готовое API и т.п. Это настоящий мега-комбайн, к которому остаётся только «прикрутить» свой интерфейс. При желании можно детально настроить Scrapy на уровне исходного кода.
Преимущества Scrapy:
Установка 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 – это набор инструментов и утилит автоматизации, обеспечивающих взаимодействие с движками браузеров. Они необходимы для поддержки некоторых важных технологий, таких как JavaScript и асинхронный AJAX.
JavaScript подразумевает загрузку и исполнение скриптов только внутри браузера, итоговый HTML нельзя получить напрямую от сервера. Соответственно никак не получится распарсить его на составляющие компоненты и теги. А это большая проблема, так как всё больше и больше сайтов, включая современные web-приложения, работают с технологией JavaScript.
Несмотря на то, что Selenium представлен несколькими разрозненными компонентами (web-драйвер, IDE-система, библиотеки, фреймворк и API), фактически это библиотека пользовательского агента браузера.
Преимущества Selenium
Установка 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 – это ещё популярная библиотека Python, которую часто используют для web-скрапинга. Она отвечает за получение и обработку URL-запросов, с её помощью можно извлекать определённую информацию из ответов сервера, фактически это лёгкий и мощный HTTP-клиент для Python.
У утилиты есть версия с официальной платной поддержкой для юридических лиц, которая доступна в единой подписке Tidelift. Не стоит путать Urllib3 и просто urllib, последняя является штатной библиотекой Python.
Преимущества Urllib3
Установка 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 – это многофункциональная библиотека Python, позволяющая производить обработку и генерацию XML-данных на HTML-страницах. LXML – это Pythonic-привязка для библиотек libxml2 и libxslt.
LXML подходит для синтаксического анализа содержимого и может сочетаться с другими библиотеками парсеров, например, с BeautifulSoup или со Scrapy.
Преимущества LXML
Установка 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-формате.