Задать вопрос

Парс выдачи Google, как обойти блокировку?

Прошу оставить моральную сторону вопроса вне обсуждения.

Оох, что я уже только не пробовал. Работало отлично, и в определённый момент просто перестало.
Допустим, есть запрос:
https://www.google.ru/search?q=%D0%BF%D1%80%D0%BE%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5+%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2&num=100


И есть код:
$useragent = $this->getUseragent();
	$curl = curl_init();
	$headers = array();
	$headers[] = "Connection:keep-alive";
	$headers[] = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
	$headers[] = "Connection:keep-alive";
	$headers[] = "Upgrade-Insecure-Requests:1";
	$headers[] = "User-Agent:".$useragent;
	$headers[] = "Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4";

	curl_setopt($curl, CURLOPT_URL,				$url); 
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 	true); 
	curl_setopt($curl, CURLOPT_HTTPHEADER, 		$headers);
	curl_setopt($curl, CURLOPT_USERAGENT, 		$useragent);
	curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 	true);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
		
	$response = curl_exec($curl);


Тестирую с локальной машины. Curl запрос получает ошибку 403 и страничку с баном.
Тут же я этот запрос открываю в своём браузере в режиме инкогнито - и сразу же получаю код 200.
Я ведь правильно понимаю, в режиме инкогнито при первом запросе нет совершенно никаких cookie, то есть google ориентируется только на request headers.

Что я делаю не так? Все заголовки в массив $headers скопировал с браузера.
Видимо есть ещё какой-то параметр, который я не передаю.

Есть идеи?

UPD: Появилось вот такое предположение:
Гугл банит как пользователей с определёнными куки, так и пользователей без куки.
Если это так, значит вероятней всего можно обойти блокировку, постоянно собирая "работающие" куки
  • Вопрос задан
  • 5836 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@nirvimel
  1. Заголовки Accept и Accept-Language зависят от User-Agent. Вы меняете User-Agent, и Гугл может фиксировать это расхождение. Попробуйте для начала вместо getUseragent() задать константную строку. Потом, если вам так нужно менять User-Agent, то посмотрите как это делает Random Agent Spoofer, он согласут все заголовки с фейковым User-Agent, возможно придется лезть в его исходники, поэтому проще с константной строкой.
  2. Попробуйте еще убрать ru-RU из Accept-Language. Это не означает, что пропадут русскоязычные результаты в выдаче или будут проблемы с кодировкой. У меня вообще вся система и браузер не локализованы, это не мешает гуглить по-русски.
  3. https://www.google.ru/search?q=q&num=100 такие запросы шлют только боты. В браузере при поиске с главной страницы Гугала идет запрос огромной длинны с десятком параметров, в том числе, какие-то уникальные хэши. Попробуйте сначала запросить главную, принять и записать все cookies, выдрать из формы поиска url, по которому уйдет запрос, добавьте туда q=blabla и посылайте новый запрос со всеми cookie. Кстати, на каждый запрос приходят новые cookie и их бы неплохо использовать в следующем запросе, как бы это происходило в реальном браузере, это увеличит время/количество_запросов до бана.
  4. Не запрашивайте сразу num=100, вам так проще парсить, а Гуглу так проще банить тех, кто парсит. Уберите этот параметр и выкачивайте SERP по одной странице. Между запросами делайте паузы в несколько секунд как серфил бы живой человек. При этом возможно параллельно работать с другим запросом из другой сессии с другим набором cookies и User-Agent, как будто несколько человек сидят с одного IP из-за NAT. Но, вообще, выборка SERP глубже одной-двух страниц сильно увеличивают подозрение в ваш адрес и приближают капчу, постарайтесь по возможности вообще отказаться от выборки 100 результатов ради того чтобы парсер работал хоть как-то.
  5. Перед тем как делать все это, запустите Wireshark и сравните в нем вживую два запроса: один из браузера, другой от вашего скрипта в его текущей реализации, возможно какие-то различия бросятся в глаза сразу.
  6. Даже при соблюдении всех условий, бан неизбежен рано или поздно, это зависит от объемов трафика, который вы создаете с одного IP. С этим уже ничего не сделать. Спасет только большой пул проксей.
Ответ написан
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
72d9cd2959734a9da83b0ee463b605aa.PNG
Попробуйте скопировать все заголовки из браузера сразу в cURL формате для вашей консоли.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы