CoderCastrov logo
CoderCastrov
Парсер

Как написать эффективный парсер (crawler)?

Как написать эффективный парсер (crawler)?
просмотров
4 мин чтение
#Парсер

Привет, надеюсь, что у вас все хорошо! В этой статье вы узнаете о техниках написания парсера, который будет выполнять свою работу эффективно. Мы также приступим к созданию простого парсера на Python 3 с использованием фреймворка Scrapy.

Важно знать...

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

Как парсить веб-страницы, не попадаясь на глаза?

В настоящее время при разработке парсеров мы используем различные техники, чтобы поддерживать непрерывный доступ к данным:

  • Средняя скорость загрузки
  • Случайная задержка между запросами
  • Перемещение по разным User-Agent'ам
  • Перемещение по разным IP-адресам
  • Установка заголовков

Почему средняя скорость загрузки?

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

Почему случайная задержка?

Написание скриптов, которые делают запросы с постоянным интервалом времени, является проблемой! Почему? Потому что обычный пользователь не имеет определенного шаблона запросов в интернете, все зависит от времени, которое он проводит на странице и совершает новое действие.

Почему перемещение по разным User-Agent'ам?

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

Почему установка заголовков?

При отправке запроса браузер отправляет заголовки, которые считываются сайтом для анализа вашей идентичности. Чтобы сделать ваш парсер более похожим на человека, вы можете скопировать заголовки запроса из браузера и использовать их в скрипте вашего парсера. Таким образом, доступ будет проходить незамеченным для большего количества "наблюдателей" 👀.

Почему перемещение по разным IP-адресам?

Это самый простой способ для системы, противодействующей парсерам, обнаружить нечеловеческий доступ. Если вы продолжаете использовать один и тот же IP-адрес для всех запросов, не обращая внимания на упомянутые выше техники, вас быстро заблокируют. Для каждого запроса важно использовать новый IP-адрес, для этого в интернете доступны различные бесплатные прокси-серверы.

Создание парсера с использованием Scrapy и Python3

Прежде всего, чтобы не «загрязнять» ваше локальное окружение, для нашего примера мы создадим виртуальное окружение, используя virtualenv.

Создайте виртуальное окружение:

$ python3 -m venv parser-example

Активируйте виртуальное окружение:

$ ./parser-example/Scripts/activate

Примечание: Если ваша операционная система не является Windows, папка 'Scripts' будет называться 'bin'.

Установите Scrapy:

$ pip install scrapy

Инициализируйте проект с помощью Scrapy:

$ scrapy startproject project_name

При выполнении указанного выше кода у вас будет структура, идентичная приведенной ниже. Для этого примера нам нужно обратить внимание только на файлы settings.py, middlewares.py и папку spiders.

  • settings.py - это место, где мы будем указывать все настройки нашего парсера, включая настройки случайной задержки и ограничения скорости загрузки, как упоминалось в техниках создания парсера.
  • middlewares.py - это место, где мы можем определить вращающиеся настройки, такие как User Agent и Proxy. Однако, поскольку общедоступные прокси не являются постоянными, мы пропустим этот шаг, чтобы сохранить пример в одинаковом виде в любое время, когда вы читаете эту статью.

Определение настроек запросов:

Для определения времени загрузки и случайной задержки мы добавляем следующий код в файл settings.py:

DOWNLOAD_DELAY = 3 AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 5 AUTOTHROTTLE_MAX_DELAY = 60

Значения могут быть изменены в зависимости от ваших потребностей, однако обратите внимание, что AUTOTHROTTLE_START_DELAY устанавливает минимальную задержку для запроса, а AUTOTHROTTLE_MAX_DELAY устанавливает максимальное значение. На основе этих настроек все запросы будут выполняться в случайное время между минимальным и максимальным значениями.

Мы также можем определить стандартный заголовок в settings.py, однако в зависимости от целевого сайта вам может потребоваться определить его в самом коде, так как заголовки могут меняться от запроса к запросу.

DEFAULT_REQUEST_HEADERS = { ... ваши заголовки}

Написание паука:

В папке spiders мы создадим файл для нашего веб-парсера. Вы можете выбрать любое имя для него, в этом примере я назову его "quotes.py", так как мы создаем парсер для извлечения цитат!

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

quotes.py

Запуск парсера:

При запуске файла параметр 'quotes' перед 'crawl' - это имя, которое мы определили в переменной 'name' созданного класса.

$ scrapy crawl quotes

Реализация случайных прокси и User Agents:

В этом примере мы не будем реализовывать эту технику, но если вы хотите, этот код должен быть размещен в файле "middlewares.py", и вы можете найти дополнительную информацию о этом файле здесь