На некоторых популярных сайтах устанавливается защита от DDoS, когда при запросе страницы сайта сначала выдаётся промежуточная страница с javascript, которая выполняет проверку на браузер (роботы / парсеры обычно не используют браузер, потому не проходят эту проверку), и, только если проверка пройдена, этот скрипт перенаправляет вас на ту же страницу, только уже с реальным её содержимым.
Скрипт этот выполняет некоторые вычисления, потом устанавливает Cookies, и при следующем запросе этой же страницы передаются эти Cookies, — так сайт определяет, что проверка на браузер успешно выполнена.
Как проверить, проблема в защите сайта от DDoS, или в чём-то другом?
В случае использования подобной защиты (Qrator, Incapsula, CloudFare и т.п.), в коде страницы вместо данных будет одна или несколько ссылок на файлы со скриптами js
Как обойти эту защиту при использовании парсера?
Вариант 1
- загружаем любую страницу сайта (например, главную) в браузере Internet Explorer
- ждём несколько секунд пока отработает скрипт
- убеждаемся что на странице прогрузились данные (что произошел редирект после выполнения скрипта)
- считываем Cookies из Internet Explorer
- выполняем запросы к сайту с использованием этих Cookies (действие Загрузить страницу по ссылке, режим загрузки — WinHTTP)
Вариант 2
Рассмотрим этот вариант на примере сайта leroymerlin.ru с защитой Qrator.
Там страницы разделов грузятся без проблем, а вот для страниц товаров срабатывает защита.
При загрузке страницы товара парсером, мы получаем очень короткий ответ:
В ответе мы видим запуск скрипта: <script src="/__qrator/qauth_utm_v2.js"></script>
Значит, это как раз тот случай, когда надо обходить такую защиту.
- читаем иструкцию по обходу подобных защит
- ищем список IP этого сайта:
https://viewdns.info/iphistory/?domain=leroymerlin.ru - берем второй IP адрес из списка (прямой адрес сайта), подставляем его в ссылку на товар вместо адреса сайта, и проверяем ссылку в браузере:
http://178.248.234.184/product/hozblok-metallicheskiy-2-05x2-57x2-02-sm-84759919/
ура, страницы отображаются в браузере, — значит, с большой вероятностью мы справимся с обходом блокировки - проверяем загрузку парсером — уже лучше, но получаем ошибку 403:
- добавляем заголовки запроса из браузера, проверяем, — всё заработало:
Действие Параметр Значение Создать новый экземпляр WinHTTPRequest Сброс Cookies и заголовков запроса да Добавить заголовок запроса Заголовок Accept Значение text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Использовать для ВСЕХ запросов да Добавить заголовок запроса Заголовок Connection Значение keep-alive Использовать для ВСЕХ запросов да Добавить заголовок запроса Заголовок Host Значение 178.248.234.184 Использовать для ВСЕХ запросов да Добавить заголовок запроса Заголовок Upgrade-Insecure-Requests Значение 1 Использовать для ВСЕХ запросов да Добавить заголовок запроса Заголовок User-Agent Значение Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36 Использовать для ВСЕХ запросов да Загрузить страницу по ссылке Способ загрузки WinHTTP Кеширование URL Дополнительные опции