Парсинг без блокировок

Как парсить в 2019 году без блокировок (банов)

Веб-парсинг (или краулинг) — это извлечение данных со стороннего веб-сайта путем загрузки HTML-кода сайта и его анализа для получения необходимых данных.

Но ведь для этого следует использовать API!

Не каждый веб-сайт предлагает API, и API не всегда предоставляет всю необходимую информацию. Так что часто парсинг — это единственный способ для получения данных с сайта.

Существует множество причин для парсинга

  • Мониторинг цен Интернет-магазинов
  • Агрегация новостей
  • Лидогенерация
  • SEO (мониторинг результатов выдачи поисковой системы)

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

Так в чем проблема?

Основная проблема заключается в том, что большинство веб-сайтов не хотят, чтобы их парсили. Они хотят предоставлять контент только реальным пользователям, использующих настоящий веб-браузер (кроме Google, ведь все сайты хотят, чтобы Google их сканировал, ну и Яндекс разумеется тоже).

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

Эмуляторы пользовательских инструментов, например, Headless Chrome

Зачем использовать предпросмотр в режиме headless (без заголовков)?

Когда вы запускаете браузер и заходите на веб-страницу, то это практически всегда означает запрос у HTTP-сервера каких-либо данных. И один из самых простых способов получить контент с HTTP-сервера — использовать классический инструмент командной строки, такой как cURL.

Но стоит помнить, что даже если вы просто выполните: curl www.google.com, у Google есть масса способов определить, что вы бот, например, просто взглянув на заголовки HTTP. Заголовки — это небольшие фрагменты информации, которые поступают с каждым HTTP-запросом, попадающим на серверы, и один из этих фрагментов точно описывает клиента, выполняющего запрос. Я говорю о заголовке «User-Agent». И, просто посмотрев на заголовок «User-Agent», Google теперь знает, что вы используете cURL. Если вы хотите больше узнать о заголовках, то на Wikipedia есть отличная статья, посвященная им.

Заголовки действительно легко изменить с помощью cURL, и копирование заголовка User-Agent легального браузера может скрыть вас от наблюдения сайта. В реальном мире вам нужно установить более одного заголовка, но в общем случае не очень сложно искусственно создать HTTP-запрос с помощью cURL или любой другой библиотеки, которая сделает этот запрос похожим на браузерный. Этот способ все знают, и поэтому, чтобы определить “подлинность” запроса, веб-сайт проверяет одну вещь, которую cURL и библиотеки подделать не могут — выполнение JS (JavaScript).

Вы “говорите” на JS?

Концепция очень проста: веб-сайт встраивает небольшой фрагмент JS в свою веб-страницу, который после его запуска “разблокирует” сайт. Если вы используете настоящий браузер, то вы не заметите разницу, но если нет, все, что вы получите — это HTML-страница с непонятным кодом на JS.

что-то не понятное 🙂

Но повторим еще раз: этот способ защиты от парсинга не является полностью надежным, главным образом благодаря nodeJS, используя который, теперь легко можно выполнить JS вне браузера. Однако, не стоит забывать, что интернет эволюционировал, и есть другие приемы, чтобы определить, используете ли вы настоящий браузер или его имитацию.

Парсинг в режиме Headless

Попытка выполнить фрагмент JS на стороне с узлом действительно трудна и совсем не надежна. И что важнее, как только вам попадется сайт, который имеет более сложную систему проверки или является большим одностраничным приложением, выполнение cURL и псевдо-JS с nodeJS становится бесполезным. Так что лучший способ выглядеть как настоящий браузер — это использовать его.

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

Самый простой способ использовать Headless Chrome —  вызвать драйвер, который объединяет все его функции в простой API, Selenium и Puppeteer — два самых известных решения.

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

Цифровая подпись

Все, а в особенности frontend-разработчики, знают, что каждый браузер ведет себя по-разному. Иногда речь может идти о рендеринге CSS, иногда JS, или просто о внутренних свойствах. Большинство из этих отличительных черт хорошо известны, и можно легко определить, действительно ли сайт посещают через браузер. Это означает, что веб-сайт спрашивает себя «все ли свойства и поведение браузера соответствуют тому, что я знаю о User-Agent, который который мне отправили?».

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

Тем не менее, в этой гонке вооружений, парсеры, как правило, имеют большое преимущество, и вот почему.

В большинстве случаев, поведение кода Javascript, когда он пытается определить, выполняется ли он в headless-режиме аналогично вредоносному ПО, которое пытается уклониться от снятия динамических цифровых отпечатков. Это означает, что JS будет вести себя хорошо в среде сканирования и плохо в реальных браузерах. И именно поэтому команда, стоящая за разработкой режима headless-Chrome, старается сделать его неотличимым от веб-браузера реального пользователя, чтобы защитить его от атак вредоносных программ. И по этой причине парсеры могут извлечь максимум выгоды из этих усилий.

Еще одна вещь, которую нужно знать, хоть параллельная работа 20 cURL является тривиальной задачей, и Chrome Headless относительно прост в использовании для небольших проектов, но при масштабировании могут возникнуть сложности. Главным образом потому, что он использует много оперативной памяти, поэтому управление более чем 20 одновременно запущенными сеансами является сложной задачей.

(Проблема управления множеством headless-Chrome — одна из многих вещей, которые решаются с помощью ScrapingNinja API.)

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

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

Эмуляция поведения человека: прокси, решение капчи и шаблон запроса

Используйте прокси

Человек, использующий браузер, вряд ли будет запрашивать с одного сайта 20 страниц в секунду. Поэтому, если вы собираетесь запрашивать с одного сайта большое количество страниц, то надо заставить сайт думать, что запросы идут от разных пользователей т.е. с разных IP адресов. Другими словами, вам необходимо использовать прокси.

Сегодня прокси стоят не очень дорого: ~ 1 доллар за IP. Однако, если вам нужно делать более чем 10 тысяч запросов в день на одном и том же веб-сайте, то затраты могут сильно вырасти, ведь вам потребуются сотни адресов. Следует учитывать, что IP-адреса прокси-серверов должны постоянно мониториться, чтобы отбросить тот, который выключился, и заменить его.

На рынке есть несколько прокси-решений, наиболее часто используемые из них: Luminati Network, Blazing SEO и SmartProxy.

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

Для создания такой сети в можете использовать scrapoxy, отличный API с открытым исходным кодом, позволяющий создавать прокси-API поверх различных облачных провайдеров. Scrapoxy создаст пул прокси путем создания экземпляров у различных облачных провайдеров (AWS, OVH, Digital Ocean). Затем вы сможете настроить свой клиент таким образом, чтобы он использовал URL-адрес Scrapoxy в качестве основного прокси-сервера, а Scrapoxy автоматически назначит прокси-сервер в пуле прокси. Scrapoxy легко настраивается в соответствии с вашими потребностями (ограничение скорости, черный список и т.д.), но его настройка может быть немного утомительна.

Не стоит забывать о существовании такой сети, как TOR, также известной как Onion Router. Это всемирная компьютерная сеть, предназначенная для маршрутизации трафика через множество различных серверов, чтобы скрыть его происхождение. Использование TOR сильно затрудняет слежку за сетью и анализ трафика. Существует множество способов использования TOR, для сохранения конфиденциальности, свобода слова, защита журналистики в режимах диктатуры и, конечно, незаконная деятельность. В контексте веб-поиска TOR может скрыть ваш IP-адрес и менять IP-адрес вашего бота каждые 10 минут. IP-адреса узлов выхода TOR являются общедоступными. Некоторые веб-сайты блокируют трафик TOR, используя простое правило: если сервер получает запрос от одного из публичных выходных узлов TOR, он блокирует его. Вот почему во многих случаях TOR проигрывает по сравнению с классическими прокси. Стоит отметить, что скорость трафика через TOR будет намного медленнее из-за множественной маршрутизации.

Капча

Но бывает так, что прокси недостаточно, и некоторые веб-сайты систематически просят вас подтвердить, что вы человек с помощью так называемой капчи (captcha). Большую часть времени капчи отображаются, только если IP-адрес вызывает подозрение, поэтому в таких случаях будет работать переключение прокси. В остальных случаях вам нужно использовать сервис решения капчи (например, 2Captchas и DeathByCaptchas).

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

Старая КАПЧА – обходится
Google ReCaptcha V2

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

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

Шаблон запроса

Последний и самый продвинутый инструмент, используемый веб-сайтом для обнаружения парсеров — это распознавание образов. Поэтому, если вы планируете отказаться от каждого идентификатора от 1 до 10000 для URL-адреса www.example.com/product/<id>, постарайтесь не делать это последовательно и с постоянной частотой запросов. Например, вы можете сохранить набор целых чисел от 1 до 10000 и случайным образом выбрать одно целое число в этом наборе, а затем парсить данные.

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

Веб-сайты, как правило, отслеживают происхождение трафика, поэтому, например, если вы хотите парсить веб-сайт в Бразилии, постарайтесь не делать это с прокси во Вьетнаме.

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

Заключение

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