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

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

1. Юзер агент

Переключение или рандомное назначение юзер агентов является одной из наиболее эффективных тактик предотвращения обнаружения. Многие сисадмины и IT-менеджеры отслеживают количество запросов с разных юзер агентов. Если они видят необычно большое количество запросов с одного IP и юзер агента - user agent/IP нарушителя будут заблокированы. Вы можете наблюдать это в действии, когда парсите с использованием стандартных заголовков, предоставляемых HTTP библиотеками. Попробуйте запросить страницу Amazon, используя стандартные заголовки запросов Python, и вы сразу получите 503.

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

from random import choice import requests desktop_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'] def random_headers(): return {'User-Agent': choice(desktop_agents),'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'} r = requests.get('https://edmundmartin.com',headers=random_headers())

Приведенный выше фрагмент кода возвращает случайный юзер агент и стандартный заголовок Chrome ‘Accept’. Этот фрагмент кода содержит десять наиболее часто используемых браузеров для десктопа. Стоит время от времени обновлять список браузеров, чтобы обеспечить актуальность юзер агентов, включенных в список.

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

2. Остальные заголовки

Даже когда вы меняете юзер агенты, есть вероятность, что вас раскроют. Иногда вас могут выдать другие элементы заголовков. Заголовки ‘accept’ и ‘accept encoding’, отправляемые HTTP библиотеками, как правило отличаются от тех, которые отправляются реальными браузерами. Вы можете модифицировать эти заголовки, чтобы сделать их максимально похожими на заголовки реального браузера.

Любой, кто присмотрится к заголовкам ‘Accept’ в примере с рандомной сменой юзер агента, быстро поймет, что различные юзер агенты используют один и тот же заголовок ‘Accept’. К счастью, большинство системных администраторов полностью игнорируют хитросплетения этих заголовков и просто проверяют, отправляют ли браузеры что-либо правдоподобное.

3. Таймауты

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

4. Прокси

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

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

Даже крупные e-commerce компании передают управление прокси на аутсорс прокси-сетям, поскольку приоритетом № 1 для большинства компаний являются данные, а не управление прокси. Многие SEO-агентства и компании, занимающимся digital маркетингом, также прибегают к подобным SaaS-компаниям для получения данных о ранжировании в поисковых системах. Они “вращают” и контролируют состояние своих прокси с целью извлечения огромных объемов данных из Google и других поисковиков.

5. Рендеринг JavaScript

JavaScript используется сейчас практически везде. Количество людей, браузеры которых не поддерживают JavaScript, составляет менее <1%. Поэтому для некоторых сайтов IP, отправляющие большое количество запросов без рендеринга JavaScript, являются одним из триггеров для блокировки. Простое решение - рендерить JavaScript, используя безголовый браузер и Selenium.

Для блокировки ботов такие компании как Cloudflare используют проверку на предмет включен ли у пользователя JavaScript. Однако в настоящее время существует несколько библиотек, которые помогут обойти защиту, реализованную Cloudflare. Библиотека Python cloudflare-scrape представляет собой обертку вокруг библиотеки запросов, которая просто запускает тест JavaScript Cloudflare в среде узлов, если обнаружит, что такая защита установлена.

Кроме того, вы можете воспользоваться облегченным безголовым браузером, таким как Splash. Этот специализированный браузер позволяет даже установить правила AdBlock Plus, позволяющие быстрее отображать страницы, и может использоваться вместе с популярным фреймворком Scrapy.

6. Исключения

То, что многие краулеры и парсеры не могут делать, - это отключение после того, как начинают получать ошибки 403 и 503. Когда после прохождения множества страниц с ошибками парсер продолжает запрашивать еще больше страниц, становится совершенно очевидно, что вы на самом деле бот. У вас должна быть возможность приостановить и возобновить парсинг, чтобы по ходу дела поправить код. Замедление и откаты назад, когда вы получаете ошибки запрещенного доступа, могут помочь вам избежать постоянного бана.

7. Honeypots/ловушки для ботов

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

8. Robots.txt

Простое соблюдение robots.txt во время парсинга может избавить вас от многих проблем. Хотя сам файл robots.txt не обеспечивает защиту от парсеров, некоторые веб-мастера просто блокируют любой IP-адрес, который делает много запросов на заблокированные в robots.txt страницы. К счастью, процент веб-мастеров, которые это делают, довольно мал. Если контент, который вам нужен, заблокирован robots.txt, вам, конечно, придется его проигнорировать. Но я настоятельно рекомендую вам уважать чужие правила, а то, что не запрещено в нем - разрешено. Старайтесь соблюдать инструкции robots.txt - это определенно может избавить вас от серьезных проблем.

9. Куки

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

10. Капча

Капча - одна из самых трудных для обхода мер по защите от парсинга. К счастью, капча невероятно раздражает и реальных пользователей, поэтому не многие сайты злоупотребляют ею. Справиться с капчей можно либо с помощью инструментов компьютерного зрения, таких как tesseract-ocr, либо можно приобрести решения в ряде API сервисов, которые используют людей для решения основных капч. Эти сервисы доступны даже для последних визуальных капч от Google - просто они будут стоить дороже.

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

P.S. Написано по материалам edmundmartin.com - полезный ресурс для всех, кто занимается парсингом или изучает его.

44
4 комментария

2. Отсальные заголовки

Забавная опечатка

Спасибо, полезная статья.

Расписано достаточно подробно