Заблокируем их всех!
Увеличение скорости парсинга с помощью Selenium и ChromeDriver
Парсинг данных с статических страниц - то есть без контента, полученного или сгенерированного с помощью 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, вот еще одна статья о процедуре.
Удачного парсинга!