Парс выдачи гугла. Что ещё я упустил?

Всем привет. Пожалуйста, оставьте моральную сторону вопроса вне обсуждений.
Возможно кто-то работал над этим...
Стоит задача - парс выдачи гугла.
Код:
/**
	 * Получаем html запроса
	 * @param string $url адрес запроса
	 * @return string  html выдачи
	 */
	private function getHtml($url)
	{
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL,				$url); 
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 	true); 
		curl_setopt($curl, CURLOPT_USERAGENT, 		'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.101 Chrome/45.0.2454.101 Safari/537.36');
		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 	true);
		$response = curl_exec($curl);

		if(curl_getinfo($curl,CURLINFO_HTTP_CODE) !== 200)
		{

			# Получаем картинку и куки
			$imgUrl = phpQuery::newDocument($response)->find("img")->attr("src");
			$curlImage = curl_init();
			curl_setopt($curlImage, CURLOPT_URL, 			"https://www.google.ru".$imgUrl); 
			curl_setopt($curlImage, CURLOPT_USERAGENT, 		'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.101 Chrome/45.0.2454.101 Safari/537.36');
			curl_setopt($curlImage, CURLOPT_RETURNTRANSFER, true); 
			curl_setopt($curlImage, CURLOPT_COOKIEJAR, 		__DIR__."/../../html/assets/cookies.txt"); 
			file_put_contents("assets/captcha.jpg", curl_exec($curlImage));
			curl_close($curlImage);
			
			# Расшифровываем капчу
			$antiCaptcha = new AntiCaptcha;
			$antiCaptcha->sendCaptcha();
			$captcha = $antiCaptcha->getCaptchaValue();

			# Формируем url запроса
			$url = "https://ipv4.google.com/sorry/CaptchaRedirect?continue=".urlencode(phpQuery::newDocument($response)->find("[name=\"continue\"]")->attr("value"))
					."&id=".urlencode(phpQuery::newDocument($response)->find("[name=\"id\"]")->attr("value"))
					."&captcha=".$captcha
					."&submit="."Submit";
					
			# Переходим по URL со всеми нужными данными
			$curlGoogleAntiCaptcha = curl_init();
			curl_setopt($curlGoogleAntiCaptcha, CURLOPT_URL, 			$url);
			curl_setopt($curlGoogleAntiCaptcha, CURLOPT_USERAGENT, 		'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/45.0.2454.101 Chrome/45.0.2454.101 Safari/537.36');
			curl_setopt($curlGoogleAntiCaptcha, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($curlGoogleAntiCaptcha, CURLOPT_COOKIEFILE, 	__DIR__."/../../html/assets/cookies.txt");
			$result = curl_exec($curlGoogleAntiCaptcha);
// Вот тут почему-то мне опять выдаётся страница с капчей (((		
			return $result;
		}

		curl_close($curl);

		return $response;
	}


Описание:
1. Если код ответа !== 200, идём по redirect url.
2. Сохраняем из этой страницы все значения нужных нам input-ов
3. Получаем картинку капчи, сохраняем в файлик куки (да, они выдаются только с картинкой)
4. Через отдельный класс расшифровываем капчу
5. Подставляем куки, значение капчи, идём по верному URL

И тут нам опять выдаётся капча... Что я делаю не так?

P.S.: Капча расшифровывается правильно. На 5ом шаге URL точно правильный.
  • Вопрос задан
  • 3165 просмотров
Пригласить эксперта
Ответы на вопрос 3
@frees2
А зачем, когда поисковые запросы выдаются в ленте rss, по старинке
https://news.google.com/news?pz=1&cf=all&ned=ru_ru...
Ответ написан
Добрый день.
Буквально недавно решал аналогичную задачу ))) с ходу вижу разницу в том, что в последнем запросе к гуглу (подтверждение капчи) я шлю пустой параметр continue. Помню, у меня тоже были проблемы с её прохождением с вашими же симптомами.
Могу поделиться абстрактным "отладочным" классом, который я сваял для тестов и отладки: pastebin.com/Eymi1U1K
И да, работа с куками тут вся возложена на curl, так что не удивляйтесь, что их в коде в явном виде нет.
Ответ написан
@newbie67 Автор вопроса
Всем спасибо, свою ошибочку сам нашёл.
joxi.ru/BA00GP6u5GpgAy
Вот где собака зарыта... Соответственно куки сохранялись для *.google.ru, а капчу я отправлял на *.google.com

И, Дмитрий , это возможно и на PHP.
Ответ написан
Ваш ответ на вопрос

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

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