Применение эффективного асинхронного web-парсинга при работе с Bigdata
Всем привет!
Меня зовут Марина Коробова, я участник профессионального сообщества NTA.
Многие компании и организации занимаются сбором большого объема внешних данных для анализа и принятия эффективных решений. Конечно, всё это можно делать вручную, но это долгий, монотонный и нецелесообразный процесс, в котором есть шанс допустить ошибки. В этой публикации мы сравним два инструмента для автоматизации сбора данных из внешних источников Scrapy и BeautifulSoup4.
Введение
Парсинг или веб-скрапинг — это автоматизированный сбор и структурирование информации из открытых источников при помощи специальной программы, называемой парсером. Технически получить доступ к открытой информации можно с помощью API, но как правило доступ ограничен или требует вложения денежных средств.
Рассмотрим принцип работы парсинга. Данный процесс происходит в несколько этапов:
- Отправка HTTP-запроса на сервер.
- Поиск необходимых данных.
- Трансформация полученных данных.
При отправке HTTP-запроса на сервер у нас есть два варианта:
- отправить запрос и ждать, пока сервер даст ответ (синхронный запрос);
- отправить запрос и продолжить работу. Когда данные будут получены, программа вызовет функцию обработчик события (асинхронный запрос).
У каждой из представленных реализаций есть свои плюсы и минусы. Так, например, асинхронный запрос значительно увеличивает производительность кода, поскольку позволяет обрабатывать несколько запросов одновременно, но его довольно сложно реализовать. В свою очередь, синхронный запрос прост в разработке и отладке, но имеет низкую эффективность за счёт последовательной отправки HTTP-запросов.
Основные проблемы парсинга
Парсинг, как и любая технология, сталкивается с рядом проблем. Перечислим наиболее актуальные:
- блокировка доступа к данным: использование CAPTCHA, блокирование IP-адресов и другое;
- скорость выполнения: большой объем данных требует много ресурсов и времени;
- сложность обработки ошибок: ошибки соединения, ошибки синтаксиса и другие;
- работа с динамическим контентом: необходимо разрабатывать специальные инструменты для анализа сайтов, использующих технологии ajax и javascript.
Реализация парсера на основе Beautiful Soup. Обзор возможностей.
Beautiful Soup — это библиотека Python для извлечения данных из файлов форматов HTML и XML. Beautiful Soup (или BS4) использует DOM-модель (Document Object Model) для трансформации и извлечения данных.
Основными возможностями BS4 являются:
- поиск элементов на странице по тегу, классу, id и другим атрибутам;
- извлечение текста и атрибутов элементов;
- навигация по дереву элементов страницы;
- манипуляции с HTML-кодом, такие как добавление, удаление или изменение элементов.
Для извлечения данных из HTML-кода необходимо использовать конструктор BeautifulSoup(), который принимает два аргумента: разметку (HTML-код) и анализатор (необходим для обработки HTML-кода). BS4 поддерживает различные библиотеки для синтаксического анализа, включая стандартные html.parser, а также более быстрые, такие как lxml и html5lib. В нашем случае будем использовать lxml. Также, для отправки запросов на сайт воспользуемся библиотекой requests.
Реализация кода на базе Beautiful Soup
Для начала установим и импортируем библиотеки.
Проиллюстрируем пример парсинга одной страницы многостраничного сайта www.banki.ru. Данную задачу можно разбить на два этапа:
- Выгрузка необходимых данных (в нашем случае мы используем отзывы на инвестиционные компании).
- Парсинг HTML-кода в удобный формат (в нашем случае будем сохранять информацию в файл с расширением .json).
В большинстве случаев объем текста отзыва не умещается полностью в отведенную для него область, поэтому нам необходимо перейти на страницу самого отзыва и получить полный текст с неё.
Пройдёмся по каждой ссылке в цикле и сохраним информацию о заголовке и тексте отзыва. На последнем этапе выгрузим полученную информацию в файл banks_one_page.json.
Парсинг многостраничного сайта заключается в последовательном парсинге каждой страницы в цикле.
В результате мы получили файл с названием и текстом отзыва. В дальнейшем мы можем анализировать эту информацию, например, визуализировать наиболее часто встречающиеся слова в тексте.
Реализация парсера на основе Scrapy. Обзор возможностей.
Scrapy — это высокоуровневый Python-фреймворк для парсинга данных с веб-сайтов, построенный на базе асинхронной библиотеки Twisted.
Основными возможностями Scrapy являются:
- автоматическая обработка запросов и ответов с использованием асинхронности;
- извлечение данных из HTML и XML документов с помощью XPath и CSS-селекторов;
- эффективная обработка веб-форм и управление сессиями;
- расширяемость за счет огромного количества плагинов, упрощающих разработку и настройку веб-пауков.
Реализация кода на базе Scrapy
Для начала необходимо установить библиотеки. Разработчики Scrapy настоятельно рекомендуют создать специальную виртуальную среду, чтобы избежать конфликта с системными пакетами – ситуации, когда один из пакетов не может работать при наличии другого. Создание изолированной виртуальной среды для проекта позволить исключить данную ситуацию.
Будем работать через терминал anaconda.
Создадим каталог, где находятся шаблоны, необходимые для управления проектом.
Перед парсингом сайта необходимо пояснить, что же такое веб-паук.
Веб-паук — класс, определяющий алгоритм сканирования веб-страниц. Существует несколько типов веб-пауков:
- scrapy.Spider – веб-паук, предоставляющий базовую структуру и функциональность для создания других пауков;
- Generic Spiders – шаблоны веб-пауков, которые можно использовать для создания подклассов scrapy.Spider:
- CrawlSpider – веб-паук, использующий набор правил (rules), задаваемых пользователем, каждое из которых определяет поведение для сканирования сайта;
- XMLFeedSpiders – веб-паук, предназначенный для извлечения данных из XML-файлов;
- CSVFeedSpider – веб-паук, предназначенный для извлечения данных из CSV-файлов;
- SitemapSpider – веб-паук, предназначенный для извлечения данных из sitemap.xml файлов, в которых хранится информация о URL-адресах, доступных для сканирования.
Создадим нашего паука. Нам необходимо переходить по страницам, чтобы импортировать информацию о заголовке и тексте отзыва. Для этого воспользуемся шаблоном crawl.
Теперь в папке со всеми веб-пауками spiders, которая находится внутри проекта, должен быть создан новый скрипт с именем паука one_page, в котором записан шаблон для сканирования веб-сайта.
Далее запустим оболочку Scrapy для нашего сайта. Это необходимо для тестирования кода.
На этом этапе мы столкнулись с ошибкой HTTP 429 Too Many Requests. Чаще всего эта ошибка означает, что количество запросов к сайту достигло предела. Но в нашем случае мы отправили всего один запрос, поэтому, скорее всего, веб-сайт блокирует наши запросы, потому что не может нас идентифицировать.
В данном случае нам следует передать информацию о клиенте в User-Agent. В оболочке scrapy это можно сделать следующий образом.
Мы получили код «200», что говорит об успешно выполненном запросе.
Если мы хотим получить конкретный элемент, необходимо воспользоваться xpath. В данном случае получим главный заголовок сайта.
Откроем скрипт one_page.py и пропишем работу паука. Перед этим необходимо настроить USER_AGENT в settings.py.
Чтобы запустить ноутбук и импортировать полученные данные, необходимо с помощью терминала зайти в папку, где хранится наш паук, и запустить следующую функцию.
Произведём парсинг многостраничного сайта.
Откроем скрипт all_pages.py и пропишем работу паука.
Чтобы запустить ноутбук и импортировать полученные данные, необходимо с помощью терминала зайти в папку, где хранится наш паук, и запустить следующую функцию.
В результате мы получили файл с названием и текстом отзыва, скрипт отработал значительно быстрее, чем BS4.
Краткие итоги
Сравнительная таблица работы BeautifulSoup и Scrapy:
Вывод
Каждый инструмент заслуживает отдельного внимания, нельзя явно указать, что один из них лучше другого, потому что для каждого типа задачи необходимо выбирать тот инструмент, который лучше для нее подходит. Если вам нужно быстро создавать масштабируемые и мощные парсеры – ваш выбор однозначно Scrapy, однако BeautifulSoup дает вам большое поле для экспериментов, позволяя настраивать свои параметры с нуля, что крайне необходимо в неклассических задачах, которые могут возникнуть в вашей работе.
Описать все детали в одной статье невозможно, поэтому, для более глубокого/детального изучения, предлагаю воспользоваться следующими ресурсами:
1. Документация:
- Scrapy: https://docs.scrapy.org/en/latest/
2. Статьи:
- High performance distributed web scraper: https://cyberleninka.ru/article/n/high-performance-distributed-web-scraper/viewer
3. Курсы:
- Udemy. Frank Andrade «Web Scraping in Python BeautifulSoup, Selenium & Scrapy 2023»: https://www.udemy.com/course/web-scraping-course-in-python-bs4-selenium-and-scrapy/
Спасибо за внимание!