Обходимо захист від ботів в google, записки програміста

Якщо ви пробували коли-небудь написати парсер видачі Google, то напевно знаєте, що в ньому передбачено ряд заходів, спрямованих проти такого використання пошукової машини. У цій замітці я розповім про декілька прийомах, що дозволяють ці заходи обійти.

Доповнення: Трохи більш зручний, на мій погляд, спосіб парсинга Google описаний в пості І ще трохи про Google Hack. Проте, ця замітка теж цікава, так що продовжуйте читання!

Щоб замітка вийшла наочніше, я накидав невеликий скрипт на Perl:

/http\:\/\/(?:www\.)([0-9a-z-]+\.ru)\//ig;
print STDERR ">>". # 40; scalar @sites # 41 ;. "Sites found \ n";
unless # 40; scalar @sites # 41; # 123;
print STDERR ">> sleeping 60 seconds. \ n";
sleep 60;
goto NEW_ATTEMPT;
# 125;
print "\ L $ _ \ E \ n" for # 40; @sites # 41; ;
sleep 6;
# 125;
# 125;

Завдання скрипта - отримати список з декількох тисяч випадкових сайтів в зоні RU. Надалі його можна буде використовувати для проведення яких-небудь досліджень. Наприклад, можна взяти вибірку з 10 000 сайтів і визначити CMS. які на них використовуються.

Так які ж складності чекають нас при парсінгу видачі гугла? По-перше, це перевірка User-agent. Якщо йому буде присвоєно значення «Wget / ...», пошукова система відмовиться виконувати запит. По-друге - капча. При занадто частому зверненні до Google зі схожими запитами відбувається перенаправлення користувача на sorry.google.com, де йому пропонується ввести цифри з картинки. І по-третє, при великій кількості запитів з одного IP, система може попросити дати їй відпочити пару хвилин, навіть якщо ми пройшли капчу.

Першу проблему вирішити дуже просто - достатньо подивитися User-agent свого браузера і налаштувати відповідним чином утиліту, за допомогою якої відбувається завантаження сторінок (wget, curl, lynx, ...). Я в своїх скриптах зазвичай використовую wget, який може замаскуватися під вогнелис за допомогою ключа -user-agent.

З капчі все трохи складніше. Написати свій распознаватель - завдання дуже непросте, хоч і яке вирішується. Але на щастя, ламати капчу не доведеться - досить пройти її один раз. Спочатку очищаємо кукіси. Для роботи з кукисам я використовую плагін Cookie Monster Addon:

Обходимо захист від ботів в google, записки програміста

Потім запускаємо наш парсер і чекаємо, поки Google не почне лаятися, що наші запити підозріло нагадують діяльність комп'ютерних вірусів.


query = 11, page = 0
>> 0 sites found
>> sleeping 60 seconds.
^ C

Зупиняємо парсер і вводимо в Google який-небудь запит. Браузер повинен показати щось на зразок цього:

Обходимо захист від ботів в google, записки програміста

Нічого не заповнюючи, запускаємо tcpdump з під рута:

tcpdump -A -s 1500 dst google.ru and port 80

Ключ -A означає, що перехоплені пакети потрібно виводити в текстовому вигляді, «-s 1500» - що для кожного пакету повинні виводитися тільки перші 1500 байт (за замовчуванням - 68). Якщо врахувати, що в мережах Ethernet це є максимально допустимим розміром пакета, ми побачимо їх цілком. Інша частина команди і так зрозуміла.

Проходимо капчу, зупиняємо tcpdump і шукаємо в перехоплених пакетах кукіси:

Видирає з HTTP-запиту печеньку (Cookie: ...) і прописуємо в нашому скрипті:

$ Opt. = "--no-cookies --header 'Cookie: S = sorry = BZXzL3t3l_-lBy59IEcOPQ ;.'";

Ось і все - капчи як не бувало! Дивно, що Google час від часу не вимагає пройти її знову. Може розрахунок був на час життя Cookie?

І остання проблема - це коли Google починає видавати сторінки на кшталт тієї, що наведена на попередньому скріншоті, тільки без капчі. У неї є два рішення - або робити затримки між зверненнями до Google (див код скрипта), або, якщо час підтискає, працювати через список проксі.

Мені здається, в нашому випадку поспішати нікуди - можна залишити парсер працювати на ніч і на ранок отримати список з декількох тисяч сайтів. До речі, якщо цей список кому-небудь потрібен - ось він.

Сподобався пост? Поділися з іншими:

(Необхідно включити JS)