Парсим сайты без блокировок

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

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

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

рекомендации по парсингу без блокировок:

  • уважайте директивы robots.txt
  • настройте скорость парсинга, не нагружайте сервер излишними запросами
  • не повторяйте паттерн обхода сайта
  • используйте прокси при парсинге и меняйте их по мере необходимости
  • изменяйте заголовки User-Agent и иные заголовки HTTP запросов
  • используйте «безголовый» (headless) браузер
  • берегитесь ловушек (honey pot)
  • проверьте, изменяет ли сайт верстку
  • избегайте парсинга данных, которые требуют авторизации
  • используйте сервисы для разгадывания капчи
  • каким образом сайты могут обнаружить сканер?
  • как узнать что сайт заблокировал или забанил вас?

Основное правило: «Будьте вежливы». Уважайте рекомендации сканирования (которые вы можете найти в файле robots.txt), уважайте пользовательское соглашение.

следование директивам robots.txt

В идеале, парсеры должны руководствоваться правилами сканирования из robots.txt при сканировании сайта. В нем могут быть определена частота отправки запросов к сайту, какие страницы можно сканировать и т.д. В robots.txt может быть запрет на сканирование определенным ботам.
Что делать, если необходимые вам данные, находятся на страницах, запрещенных к сканированию директивами robots.txt? Вы можете спарсить эти страницы (в конце концов, директивы robots.txt являются рекомендациями, а не строгими правилами). Но это чревато, тем что такое поведение может вызвать срабатывание систем защиты от парсинга и последующую блокировку вашего бота.

настраивайте скорость парсинга, не нагружайте сервер

Боты могут очень быстро загружать страницы и извлекать из них данные, но это же и позволит легко обнаружить ваш парсер. Ведь люди не могут просматривать страницы с такой скоростью. Чем быстрее сканируете, тем хуже для всех. Получая множество запросов, сервер может перестать справляться с их обработкой и сайт перестанет работать.
Сделайте свой парсер более «человечным», имитируя действия реального пользователя. Добавьте несколько случайных задержек, между запросами страниц. Сделайте паузу после загрузки некоторого кол-ва страниц. Установите минимально возможное количество одновременных запросов. Отправляя один запрос раз в 10-20 секунд, вы не будете перегружать сервер запросами.

не повторяйтесь при сканировании

Обычно, просматривая сайт, люди не повторяют один и тот же набор действий из раза в раз. В то время как парсеры, как правило используют одинаковый шаблон сканирования, т.к. были запрограммированы таким образом. Системы защиты легко могут обнаружить сканер, по закономерностям в его поведении.
Добавляйте больше случайностей в своих «пауков».

используйте прокси и чередуйте их

При посещении сайта (человеком через браузер или парсером), вебсервер получает IP-адрес посетителя. И использует его как один из методов идентификации пользователя. И сайт может собирать данные о вашем поведении, на основе IP-адреса.
Множественные запросы с одного IP-адерса могут привести к блокировке. Поэтому вам понадобится использовать прокси. Это позволит изменить ваш IP-адрес и избежать блокировки по IP.
Создайте или арендуйте пул прокси и используйте случайным образом или по порядку для отправки запросов к сайту.
Для смены IP можно использовать:

  • TOR
  • VPN сервисы
  • бесплатные прокси (в большинстве случаев медленные и нестабильно работающие. а так же с большой долей вероятности уже заблокированные целевым сайтом)
  • shared (шаред, общие) прокси. самые доступные из платных. как правило ими пользуется много других людей и шансы блокировки сайтом достаточно велики.
  • private (приватные, частные) прокси. используются парой человек и вероятность блокировки ниже.
  • серверные прокси. быстрые и с большими пулами IP-адресов. стоят дешевле чем резидентные и их легко выявить.
  • резидентные (местные) прокси. для работы с сайтом, который активно используют защиту. дорого и медленней чем общие или серверные прокси.
  • ваш провайдер может предоставлять услугу автоматической смены IP. и вам достаточно перезапустить ваше интернет соединение, для получения нового адреса.

меняйте и чередуйте заголовки User-Agent и другие заголовки HTTP запросов

User-Agent, это заголовок, который сообщает серверу, какой браузер используется для просмотра страницы. Без User-Agent сервер может отдать вам содержимое страницы. Каждый запрос сделанный из браузера, содержит набор заголовков, один из которых и есть User-Agent. Этот заголовок может быть использован системой защиты для вашей идентификации и блокировки. Поэтому стоит позаботиться об этом и составить список реальных User-Agent`ов, который вы сможете использовать, поочередно указывая их при отправке запросов.
Но вы можете обнаружить, что одной смены User-Agent недостаточно и необходимо изменять и некоторые другие заголовки.

  • Accept
  • Accept-Language
  • Referer
  • DNT
  • Updgrade-Insecure-Requests
  • Cache-Control

правильные наборы заголовков можно получить из инструментов разработчика в браузере или используя инструменты анализа трафика.
Будет полезным сервис преобразования curl запросов (может быть скопирован в google chrome браузере) в готовый код Python (и ряд других языков)
https://curl.trillworks.com/
Создавая комбинации из заголовков User-Agent и других заголовков и чередуя их при запросах, вы можете снизить вероятность блокировки.

«безголовый» (headless) браузер

Бывает так, что сайт проверяет отправлен запрос настоящим браузером или парсером, имитирующим браузер. Самая простая проверка подобного типа, это может ли браузер выполнить код javascript. Если не может, то это с большей долей вероятности бот и его можно заблокировать (или пометить как подозрительного)
Для успешного прохождения таких проверок, используют «безголовые» (headless) браузеры

  • Selenium
  • Puppeteer и Pyppeteer
  • Playwright

Но системы защиты от парсинга с каждым днем становятся все умней и изощренней. Самые продвинутые, используют проверки на стороне клиента и они гораздо более продвинутые чем просто возможность выполнения javascript.
Сервисы защиты ищут любые признаки, которые позволят выявить, что браузером на самом деле управляет бот, а не человек.
определенные сигнатуры ботов
поддержка нестандартного функционала браузера
признаки инструментов автоматизации
паттерны поведения человека (движения мышки, выделение текста на странице, переключения вкладок и т.д.)
Вся эта информация объединяется и служит в качестве «отпечатка», который помечает вас как бота или человека.

ловушки или honey pot

это система, призванная для обнаружения разного рода сканеров/парсеров. Например это может быть ссылка, невидимая для обычного пользователя, но которую могут обнаружить парсеры.
Такие ссылки-ловушки, могут быть замаскированы при помощи CSS (иметь атрибут display:none или замаскированы под цвет фона). И те кто посетят страницу по такой ссылке с большей долей вероятностью будут ботом и будут заблокированы.

динамическая верстка

Отдельные сайты усложняют задачу парсерам, изменяя верстку. На одной странице HTML код выглядит по одному, а на другой уже совсем по другому. Что может сильно усложнить задачу извлечения необходимых данных (при помощи селекторов xpath или CSS). Возможно понадобится предварительно обработать страницу, чтобы иметь возможность извлечь данные.

парсинг данных, требующих авторизации

авторизация — разрешение на доступ к данным на сайте. Часть сайтов закрывает доступ к информации, без авторизации. После авторизации, браузер или парсер, вместе с запросами будет отправлять некоторый набор информации, позволяющий серверу легко отслеживать ваше поведение при работе с сайтом и блокировке при необходимости.
Желательно избегать парсинга сайтов с авторизацией. Т.к. вас очень легко заблокировать. Но если иного выхода нет, используйте «безголовые» браузеры и имитируйте поведение человека.

сервисы для разгадывания капчи

Часть сайтов для борьбы с парсерами используют так называемую «капчу». Обычно они имеют вид изображения с сильными искажениями, на которых необходимо прочитать текст, выполнить математическое действие и т.д. И при парсинге сайта, он может вместо страниц с нужными вам данными, показывать «капчу» и только после ее «решения», позволить дальше работать с сайтом. Можно решать «капчу» самостоятельно, но практичней использовать или сервисы автоматического разгадывания капчи (антигейт, рукапча, капмонстрклауд) или программы для разгадывания капчи (ксевил, капмонстр). При больших объемах парсинга, это позволит вам экономить время и деньги.

каким образом сайты могут обнаружить парсер?

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

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

сайт заблокировал вас или нет?

Если ваш парсер сталкивается со следующим поведением сайта, то вероятней всего вас заблокировали или забанили.
Постоянные капчи
Необычные задержки с отдачей контента сервером
сервер отвечает с заголовками HTTP 404/301/50х, вместо HTTP 200 OK(в целом, получение кодов ответа отличных от 200 OK, указывает что вероятно парсер работает не так как задумано)
сервер возвращает страницу, с текстом, где сообщается о вашей блокировке

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