Гонка веб-парсеров
Table Of Content
Используя Beautifulsoup, Scrapy и Selenium для относительно небольших проектов.
Нам нужны данные для работы над проектом по науке о данных. К счастью, Интернет полон данных. Мы можем получить их, извлекая готовые данные из источника или вызывая API. Иногда они находятся за платной стеной, или данные не обновляются. Тогда единственный способ получить данные - с веб-сайта. Для простых задач копирование и вставка подходит. Но для больших данных, которые распределены по нескольким страницам, это непрактично. В таких случаях веб-парсинг может помочь вам извлечь любые данные, которые вам нужны. Это можно сделать несколькими способами. Существует несколько пакетов для Python, которые отвечают этой конкретной потребности.
Из этих пакетов Beautifulsoup и Scrapy являются самыми популярными. Scrapy - это инструмент, специально созданный для загрузки, очистки и сохранения данных из Интернета, и он поможет вам от начала до конца; тогда как BeautifulSoup - это более маленький пакет, который поможет вам только получить информацию из веб-страниц, для других задач он зависит от других пакетов. С другой стороны, у Scrapy есть встроенная вокруг него структура для этой конкретной цели. Еще один популярный вариант - Selenium. Хотя Selenium не создан специально для этого, он предназначен для автоматизированного тестирования веб-сайтов. Одним из побочных продуктов этого является возможность использовать его для веб-парсинга.
В этой статье я проанализирую три самых популярных инструмента для веб-парсинга на Python, парся целевой веб-сайт, чтобы вы могли выбрать тот, который лучше всего подходит для вашего проекта. Как примечание, всегда будьте уважительны и соблюдайте этику при парсинге и следуйте инструкциям в файле robots.txt на корневом каталоге целевого веб-сайта.
Теперь позвольте мне немного объяснить свой процесс. Я не использую многопроцессорность для Beautifulsoup, которая позволяет отправлять несколько запросов одновременно и ускоряет процесс. Я также не использую пауки для Scrapy, хотя это не предпочтительный способ. Цель этой статьи - получить показатели производительности для относительно небольшого проекта. В этом тесте оба используют библиотеку requests для получения HTML и обработки ответа.
Я использую jupyter notebook для этого анализа. Мой целевой веб-сайт - http://books.toscrape.com/. Я парсю первые 20 страниц 31 раз с использованием Beautifulsoup, Selenium и Scrapy. Затем смотрю на время обработки. Все измерения времени обработки указаны в секундах. Beautifulsoup использует моникер bs4.
Теперь вот среднее значение, стандартное отклонение, минимум, максимум и квартили. Цветовая кодировка идет от зеленого до темно-фиолетового по строкам для высоких и низких значений.
Из таблицы видно, что bs4 и scrapy имеют схожую производительность, превосходя selenium на порядок по среднему значению. Scrapy быстрее в терминах сырого числа. Разница между scrapy и bs4 в этой настройке не так велика.
Scrapy может быть еще быстрее, если использовать его в полной мере, т.е. настроить паука и запустить без зависимостей, которые я использовал. Опять же, для небольшого проекта это некоторое избыточество. Для небольшого проекта, где не требуется регулярное самостоятельное использование, это необязательно, на мой взгляд. Scrapy слишком мощный и поэтому более сложен в настройке.
Для визуализации вот распределение этих точек данных, размер ячейки 15. Это подтверждает результаты.
Кроме того, вот нормализованная плотность этих точек данных, размер ячейки 15.
Давайте сделаем сравнение:
Beautifulsoup:
Преимущества - это быстрота, удобство использования и эффективность.
Недостатки - не может обрабатывать современные веб-страницы, использующие JavaScript, недостаточно много плагинов, не может обрабатывать выражения XPath, чтобы перечислить несколько.
Используйте для быстрого парсинга.
Scrapy:
Преимущества - это быстрота, эффективность, мощная обработка после парсинга, автоматизация, конвейер и промежуточное программное обеспечение, возможность возобновления, возможность выполнения нескольких запросов одновременно, сильное сообщество и хорошая документация.
Недостатки - не подходит для начинающих, крутизна обучения выше, не требователен к ресурсам.
Используйте при необходимости многократного использования парсинга, лучше всего подходит для сложного парсинга.
Selenium:
Преимущества заключаются в том, что он может работать с веб-приложениями на основе Core JavaScript, может выполнять запросы AJAX/PJAX, лучше обрабатывает пользовательский ввод.
Недостатки заключаются в том, что он не предназначен для парсинга, неэффективен для парсинга.
Используйте, когда это единственный вариант для извлечения данных с сложного веб-сайта.
Таким образом, все сводится к тому, какой у вас сценарий использования, нет единого идеального решения. Удобно иметь все это в своем наборе инструментов для науки о данных, когда ситуация требует. У них всех есть свои сильные и слабые стороны.
Кстати, Pandas можно использовать для парсинга веб-сайта, если он содержит таблицу.
import pandas as pd# получить данные и сохранить в dataframe
df = pd.read_html('http://example.com/')
Теперь, когда это учтено, давайте рассмотрим код, который я использовал для получения результата. Файлы можно найти здесь на GitHub.
Beautifulsoup:
Selenium:
Scrapy:
Теперь, когда у меня есть все это в виде списка, давайте преобразуем их в pandas data frame и проведем некоторый анализ.
Вот как я получил все результаты и цифры, показанные выше.
Это все на сегодня. До следующего раза!