CoderCastrov logo
CoderCastrov
Анализ данных

Гонка веб-парсеров

Гонка веб-парсеров
просмотров
4 мин чтение
#Анализ данных

Используя 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.

Теперь вот среднее значение, стандартное отклонение, минимум, максимум и квартили. Цветовая кодировка идет от зеленого до темно-фиолетового по строкам для высоких и низких значений.

performance metrics

Из таблицы видно, что bs4 и scrapy имеют схожую производительность, превосходя selenium на порядок по среднему значению. Scrapy быстрее в терминах сырого числа. Разница между scrapy и bs4 в этой настройке не так велика.

Scrapy может быть еще быстрее, если использовать его в полной мере, т.е. настроить паука и запустить без зависимостей, которые я использовал. Опять же, для небольшого проекта это некоторое избыточество. Для небольшого проекта, где не требуется регулярное самостоятельное использование, это необязательно, на мой взгляд. Scrapy слишком мощный и поэтому более сложен в настройке.

Для визуализации вот распределение этих точек данных, размер ячейки 15. Это подтверждает результаты.

distribution of run time in seconds

Кроме того, вот нормализованная плотность этих точек данных, размер ячейки 15.

normalized distribution of run time

Давайте сделаем сравнение:


Beautifulsoup:

bs4

Преимущества - это быстрота, удобство использования и эффективность.

Недостатки - не может обрабатывать современные веб-страницы, использующие JavaScript, недостаточно много плагинов, не может обрабатывать выражения XPath, чтобы перечислить несколько.

Используйте для быстрого парсинга.

Scrapy:

scrapy

Преимущества - это быстрота, эффективность, мощная обработка после парсинга, автоматизация, конвейер и промежуточное программное обеспечение, возможность возобновления, возможность выполнения нескольких запросов одновременно, сильное сообщество и хорошая документация.

Недостатки - не подходит для начинающих, крутизна обучения выше, не требователен к ресурсам.

Используйте при необходимости многократного использования парсинга, лучше всего подходит для сложного парсинга.

Selenium:

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 и проведем некоторый анализ.

Вот как я получил все результаты и цифры, показанные выше.

Это все на сегодня. До следующего раза!