Парсинг сайтов: когда становится сложнее, чем просто «скачать страницу»
Парсинг сайтов, когда-то считавшийся относительно простой задачей, становится все более и более сложным. Веб-разработчики применяют все новые и новые методы для защиты своих данных от автоматизированного сбора, заставляя "парсеров" имитировать поведение человека все точнее.
Имитация человека: от простых запросов к сложным сценариям
Раньше достаточно было просто отправить HTTP-запрос и получить HTML-страницу. Но теперь сайты требуют от грабберов имитации более естественного поведения:
- JavaScript: Многие сайты используют JavaScript для динамической загрузки контента. Простой парсинг HTML больше не работает – нужно запускать JavaScript, чтобы получить полную страницу.
- Куки и сессии: Сайты отслеживают пользователей с помощью куки и сессий. Парсер должен имитировать это поведение, сохраняя и передавая куки, чтобы не вызвать подозрений.
- Проверка CAPTCHA: Сайты используют CAPTCHA для защиты от автоматизированных запросов. Парсер должен уметь распознавать и вводить CAPTCHA, что значительно усложняет задачу.
- Адаптивный дизайн: Сайты адаптируются под разные устройства и браузеры. Иногда парсер должен имитировать поведение конкретного устройства, чтобы получить корректный контент.
Безголовые браузеры, такие как Puppeteer или Selenium, позволяют запускать JavaScript и имитировать взаимодействие с сайтом. Однако они не являются панацеей:
- Замедление работы: Запуск браузера и выполнение JavaScript значительно замедляет работу парсера по сравнению с простым HTTP-запросом.
- Обнаружение: Сайты могут обнаруживать безголовые браузеры и блокировать доступ.
- Сложность: написание кода для управления браузером – это задача несколько сложнее, чем запрос страницы на PHP.
- Ресурсы: установка, например, селениума, требует VPS и желательно не самой дешевой конфигурации.
Попросил заказчик спарсить сайт федресурс – собрать данные по обременениям (лизингу), находящиеся в открытом доступе. Если посмотреть на сайт (fedresurs.ru/encumbrances), то сразу будет видно, что для поиска требуется выполнять JS – то есть необходим, чтобы было на чем его выполнять. Иным словами браузер – хотя бы безголовый.
Создаем проект на Java, подключаем необходимые библиотеки селениума, пробуем спарсить страницу отдельного договора. Да, все получается, нет капчи и защиты (понятно, что не все защиты обнаруживаются сразу, но если делать не агрессивный, а медленный парсинг, то чаще всего можно долго и успешно собирать необходимую информацию. Как паучок).
Пробуем получить список обременений (урлов) через поиск, но тут вылезает интересная проблема - их нет, этих урлов – они формируются в момент клика. Точнее, не так. Список урлов появляется после поиска, но хранится в памяти браузера и не выводится на странице при формировании html.
Здесь можно пойти двумя путями. Первый – залезть в память браузера и извлечь оттуда необходимую информацию. Второй – открывать ссылки поочередно и забирать адреса оттуда.
В любом случае это затрудняет процесс сбора информации, делает его еще более долгим.
Выводы
Парсинг сайтов становится все более сложной задачей, требующей от разработчиков парсеров все большего мастерства и изобретательности. Необходимость имитации человеческого поведения, запуск JavaScript, работа с куки и сессиями, распознавание CAPTCHA – все это усложняет процесс сбора данных. Безголовые браузеры, хоть и помогают, но не решают проблему полностью. Разработчикам парсеров приходится идти на компромиссы между скоростью, надежностью и стоимостью. Иногда заказчику бывает дешевле нанять студента для разового сбора информации, чем платить мне за разработку инструмента.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.