Блог Froxy | Новости, полезные статьи о использовании прокси

Гайд по успешному веб-скрапингу без блокировок

Written by Команда Froxy | 14.12.2023 10:00:00

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

Отдельные сайты и некоторые крупные интернет-площадки знают о том, что их парсят собственные клиенты, поэтому они предоставляют специальные API-интерфейсы, чётко оговаривают лимиты и технологию получения данных. Но это большая редкость. Обычно парсинг воспринимается как зло, потому что из-за большого числа параллельных запросов создаётся серьёзная нагрузка на сервер, а это в свою очередь чревато повышением расходов на обслуживание IT-инфраструктуры.

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

Но на каждую хитрую систему защиты обязательно найдётся такое же хитрое средство обхода. Ранее мы уже писали о том, что такое парсинг, чем отличаются веб-скрапинг и веб-краулинг, какие есть инструменты для парсинга Amazon, какие существуют библиотеки для парсинга на Python, а также для языка Go.

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

Установка случайных интервалов между запросами

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

А многие программы-парсеры как раз работают на основе заранее определённых задержек между запросами. Да, часто их можно заменить на свои значения, но настройки эти глобальные и прописываются централизованно для сессии или для отдельного проекта. Сама задержка обычно задаётся максимально точно (в секундах или миллисекундах), поэтому легко отслеживается на уровне анализа запросов. Достаточно 3-4 запроса, чтобы понять, что сессию открыл бот.

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

Например, на Python достаточно пары строк кода:

import random # импортируется библиотека для работы с генератором чисел

time_sleep = random.uniform(1, 9) # определяется диапазон, в котором будут генерироваться случайные числа

time.sleep(time_sleep) # между запросами используется пауза, которая на текущий момент записана в переменной, при каждой итерации переменная будет меняться

Естественно, конструкцию стоит использовать внутри цикла обхода массива URL-адресов.

Использование ротируемых прокси и сервисов очистки

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

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

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

При очередной попытке коннекта, если запрос исходит от IP-адреса из черного списка, то такое соединение сбрасывается или клиенту выдаётся системная заглушка. Парсинг становится невозможным.

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

Про преимущества и недостатки бесплатных прокси

Лучший вариант – качественные профильные провайдеры, предлагающие услуги аренды прокси, например, как Froxy.

Тип прокси и охват сети имеет решающее значение. Лучшие типы прокси для парсинга – мобильные (что такое мобильные прокси и как они работают) или резидентные (что такое резидентные прокси и как они работают).

Если нет желания возиться с выгрузкой и загрузкой списков IP-адресов, лучше использовать прокси с обратной связью, они же BackConnect-прокси.

Если ваш парсер не поддерживает работу через прокси, то это скорее всего не парсер.

Откройте настройки программы и загрузите список прокси в специальное поле. В норме, когда парсеры поддерживают разные типы прокси (HTTP или SOCKS, сравнение протоколов) и умеют предварительно проверять доступность IP.

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

Установка правильных заголовков и имени пользовательского агента

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

Что мешает антифрод-системе параллельно анализировать ту же самую информацию и выявлять подозрительные запросы? Собственно говоря, ничего, поэтому многие крупные сайты так и делают:

  • Проверяют соответствие аккаунта и идентификаторов в cookies.
  • Считывают свои и чужие куки для получения цифровых отпечатков.
  • Анализируют набор шрифтов, представленных в операционной системе.
  • Проверяют соответствие кодировки, локали и т.п.

Правильные парсеры умеют представляться актуальными версиями браузеров и формировать наиболее важные технические заголовки.

Если вы пишите свой парсер с нуля, не забудьте предусмотреть параметры для заголовков:

  • User-Agent
  • Connection
  • Accept
  • Accept-Encoding
  • Accept-Language
  • Cache-Control
  • Referer

Отдельные сайты могут проверять и другие заголовки в запросах, например, Cookie и Authorization. О referer-заголовках расскажем в разделе ниже.

Пример того, как могут выглядеть запросы с прописанными заголовками, можно подсмотреть в вашем реальном браузере. Сделать это можно здесь: https://httpbin.org/headers (просто посетите страницу в любимом обозревателе).

Пример того, как может выглядеть полный HTTP-запрос, можно посмотреть по ссылке https://httpbin.org/anything

Указание источника (заголовок Referer)

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

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

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

За передачу этой информации отвечает http-заголовок Referer.

Пример:

Referer: https://www.yandex.ru/search/?text=referer+header&lr=35&search_source=chromentp_desktop

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

Даже указание просто сайта ПС будет плюсом:

Referer: https://www.google.com/

Так http-запрос выглядит максимально убедительно и никаких подозрений не вызывает.

Использование безголовых (headless) браузеров

Многие современные сайты задействуют JavaScript не только для управления отдельными элементами страниц, но и для полного формирования итогового HTML-кода. Другими словами, если вы запросите весь код страницы, то получите в ответ мешанину из JS-скриптов, которую практически невозможно распарсить стандартными средствами анализа структуры HTML-документов.

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

Основная проблема в том, что итоговый HTML-документ формируется не на сервере, а непосредственно внутри браузера, после исполнения всей совокупности JS-скриптов.

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

Такой программный интерфейс (он же API) можно получить на базе:

  • Selenium WebDriver
  • Puppeteer
  • ChromeDriver
  • Chrome DevTools Protocol
  • Playwright
  • PhantomJS
  • SlimerJS
  • И т.п.

С недавних пор в Chrome DevTools есть поддержка командной строки.

Наиболее популярные решения позволяют комбинировать Headless-браузеры с прокси-серверами.

Обратите внимание на то, что каждый новый экземпляр Headless-браузера потребляет ресурсы ПК или сервера почти как обычный экземпляр браузера с графическим интерфейсом.

Если вы задействуете библиотеку Selenium или аналоги, то позаботьтесь о стелс-режиме для неё. В свою очередь вам могут потребоваться другие дополнительные библиотеки, например, такие как undetected_chromedriver.

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

Многие крупные сайты, например, Amazon, Instagram, eBay, Craigslist, Facebook и другие, отслеживают попытки входа в разные учётные записи с одного IP и могут заблокировать все связанные аккаунты из-за нарушений политики честного использования. Поэтому обязательно работайте через прокси.

Обход ловушек-приманок (Honeypot) и анализ ошибок

Ловушки-приманки – это максимально простые, но эффективные средства защиты сайтов от ботов и парсеров. Обычно это некие элементы страницы (например, формы ввода или ссылки), которые видят средства автоматического анализа HTML-кода, но не видят обычные пользователи. Любая попытка обращения к такому элементу позволяет однозначно определить нарушителя.

Например, в коде сайта может быть прописана такая ссылка:

<a href="https://целевой.домен/honeypot" style="display: none">Какой-то текст</a>

Атрибут style="display: none" делает её невидимой для обычных пользователей, соответственно кликнуть или перейти по указанному адресу пользователь никак не может.

Парсер же «видит» все ссылки в документе. При попытке перехода он попадает в ловушку и мгновенно себя обнаруживает.

Для обхода приманок можно на уровне HTML-кода:

  • отслеживать применение CSS-свойств «display: none» или «visibility: hidden»,
  • пытаться обнаруживать совпадение цвета текста (ссылки) с цветом фона,
  • отслеживать вынос элементов за пределы зоны видимости экрана,
  • соблюдать правила, прописанные в файле robots.txt (нельзя посещать разделы и страницы, запрещённые к индексации).

Другой интересный момент – отслеживание ошибок 4** (отсутствующие/перемещённые страницы) и 5** (отказы сервера). Если парсер будет обращаться к серверу или к отсутствующим страницам слишком часто, то он легко может попасть в черный список.

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

Примерная формула: ((2n + random_number_milliseconds), maximum_backoff)

Максимальное время можно выставить примерно в диапазоне 33-65 секунд.

Использование служб для решения КАПЧИ

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

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

Если вы хотите автоматизировать разгадывание любой капчи, то нужно обратиться к специализированным сервисам, таким как 2Captcha, AntiCAPTCHA, ruCaptcha и т.п. Они представляют собой биржи, привлекающие реальных людей и оплачивающие их труд.

Обмен данными с указанными сервисами происходит по API. Для запуска процесса нужно пополнить лицевой счёт и указать ставки на операции разгадывания (чтобы повысить привлекательность для тех, кто занимается решением капчи).

Отслеживание ограничений скорости и отказов в доступе

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

Соответственно, многие web-сайты намеренно ограничивают скорость подключения и число запросов к серверу (совершаемых параллельно или в пересчёте на определённый промежуток времени) для каждого конкретного пользователя (IP-адреса). Так они защищают свои вычислительные ресурсы и обеспечивают доступность для других пользователей.

Действующие лимиты для отдельно взятого клиента могут быть обозначены в заголовках X-RateLimit-Limit (данные будут соответствовать максимальному числу запросов в секунду). Логично предположить, что если вы будете их нарушать лимиты при парсинге, то сервер будет блокировать ваши подключения.

Плюс, вместо кода состояния 200 сервер может вернуть ошибку 429 (она означает, что сайт получает слишком много запросов) или 503 (полная недоступность сервера).

При получении таких ошибок парсинг нужно приостановить на некоторое время и попытаться восстановить снова. Если ошибка остаётся, нужно пробовать сменить прокси или параметр user-agent.

Парсинг данных из кэша Google

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

Метод подходит не всегда:

  • Некоторые сайты могут просить Google не кешировать их контент (соответственно кешированных версий просто не будет).
  • Информация в кеше часто бывает устаревшей и потому неактуальной.

Обращение к кешированной версии страницы производится следующим образом:

https://webcache.googleusercontent.com/search?q=cache:https://froxy.com/

Где вместо «https://froxy.com/» нужно указать целевой URL-адрес.

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

Выводы и рекомендации

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

Каким бы ни был ваш парсер, если вы хотите работать с большим объёмом данных и собирать параллельно информацию с большого количества страниц, вам никак не обойтись без прокси. Только они помогут обойти блокировки по IP и ограничения по числу подключений к серверу, существенно снизить частоту показа капчи.

Лучшие ротируемые прокси с глобальным охватом и точностью геотаргетинга (до уровня города) можно найти у Froxy. Наша сеть включает в себя более 8.5 млн. IP из более чем 200 стран, в наличии настраиваемые форматы выгрузки списков прокси, API и до 1000 параллельных портов. Типы прокси: мобильные и резидентные (идеальны для парсинга и других бизнес-задач), работающие на протоколах HTTP и SOCKS.