CoderCastrov logo
CoderCastrov
На русском

Заблокируем их всех!

Заблокируем их всех!
просмотров
3 мин чтение
#На русском

Увеличение скорости парсинга с помощью Selenium и ChromeDriver

J’ai mis un temps fou à faire cette superbe image d’illustration qui n’a rien à voir avec le sujet abordé, soyez indulgents.

Парсинг данных с статических страниц - то есть без контента, полученного или сгенерированного с помощью JavaScript - довольно простая задача для понимания и выполнения. Однако ситуация усложняется, когда нужно получить информацию с динамических страниц, содержимое которых генерируется с помощью JS. В таких случаях мы обращаемся к решениям на основе Firefox или Chrome.

Вы уже знакомы с принципом парсинга с помощью Selenium, иначе вы бы не читали это. Однако, возможно, стоит уточнить, что выполнение JS вместе с отображением CSS и изображений не всегда является необходимым. И даже не говорю уже о рекламе...

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

В целях удобочитаемости мои примеры будут относиться только к ChromeDriver и Python. В конце статьи вы найдете ссылку на Firefox.


Сократить содержимое до минимума

Если понятное отображение страниц не является жизненно важным, то можно обойтись без него. Это позволит нам сократить страницы и уменьшить время загрузки. Давайте сразу перейдем к сути: что нам действительно нужно?

  • HTML для получения данных
  • Минимальное количество JavaScript
  • ничего больше...

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

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

profile.managed_default_content_settings.images
profile.default_content_setting_values.notifications
profile.managed_default_content_settings.plugins
profile.managed_default_content_settings.popups
profile.managed_default_content_settings.geolocation
profile.managed_default_content_settings.media_stream

Вы заметите, что нигде не упоминается возможность отключения поддержки CSS. Google не поможет нам с этим вопросом.

В отсутствие решения, нам нужно его создать. Идея очень проста: создать своего рода "брандмауэр", чтобы блокировать все входящие запросы и пропускать только то, что мы хотим.

Невозможно сделать это непосредственно в скрипте, поэтому почему бы не создать расширение для Chrome! Это не так сложно.

Создание расширения для Chrome

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

Наше расширение состоит, по крайней мере, из двух файлов: manifest.json и background.js.

manifest.json

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

background.js

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

Приведенный выше пример будет блокировать все запросы, URL которых не содержит .monsupersite.fr, и пропускать все остальное.

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

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

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

Проверьте его на сайте для парсинга и убедитесь, что другие сайты блокируются.

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

Упаковка и выполнение

Осталось только создать файл .crx, нажав на Упаковать расширение на экране расширений Chrome, а затем добавить его в свой проект.

В зависимости от используемого языка, метод может отличаться:


Этот метод позволит вам сэкономить до 3 раз больше времени в процессе парсинга, что немаловажно, когда нужно анализировать сотни страниц.

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

Если вы предпочитаете Firefox, вот еще одна статья о процедуре.

Удачного парсинга!