Блог Froxy | Новости, полезные статьи о использовании прокси

Python-библиотеки для парсинга

Written by Команда Froxy | 12.10.2023 9:00:00

Парсинг данных с сайтов конкурентов или даже со своих собственных сайтов можно организовать несколькими способами: на базе готовых решений (это могут быть программы-парсеры, устанавливаемые на ваш ПК или на сервер, а могут быть и готовые облачные сервисы с 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-формате.