Php + curl парсинг выдачи гугла

Код тут пока ничем не поможет, обычный запрос + проверка на результат:
function get_page ($link, $flag = false) {
if ($flag === true) @unlink('tmp/cookie.txt');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $link);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'tmp/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'tmp/cookie.txt');
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

function google_page ($page, $link, $key) {
do {
$block = explode('id="res"', $page);
if (empty($block[1])) {
$id = $this->get_google_captcha_id($page);
$file = $this->save_google_img($this->get_page("Для просмотра ссылки Войди или Зарегистрируйся"), $id);
// Отправка капчи на antigate для распознавания
do {
$responce = $this->recognize($file, $key);
preg_match_all('/error|waiting|not\sready|timelimit/i', $responce, $matches);
} while (!empty($matches[0][0]));
//unlink($file);
$new_link = $this->google_captcha($id, $link, $responce);
$page = $this->get_page($new_link);
}
} while (empty($block[1]));
$result = $block[1];
return $result;
}
Только тут ведь ошибка в том, что я пытался достать капчу по id, а это неверно.
Пока не нашел решения, как сохранить капчу.
 
Я уже и Google search API смотрел, но результат не совпадает с обычным поиском (в результате мне нужно узнавать первые 20 позиций).
 
тут ведь ошибка в том, что я пытался достать капчу по id, а это неверно.
Нет... Вы не поняли о чем я говорил... Судя по описанию выше я решил что запрос капчи по 1 адресу ведется дважды...
Код не полный (зачем давать код в котором есть функции не описанные ?) Но пока судя по ему ошибка скорее в отправки данных распознаной капчи...
 
Хотел посмотреть как отправляются данные при вводе капчи на гугле но так и не добился её... ((
К стати говоря есть ведь ещё вариант не капчу распозновать а сменить IP... Можно веть работать и через прокси... Но это так к сведению...

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

<?php
function get_page ($link, $flag = false) {
if ($flag === true) @unlink('tmp/cookie.txt');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $link);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'tmp/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'tmp/cookie.txt');
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

function google_page ($page, $link, $key) {
do {
$block = explode('id="res"', $page); // В выдаче результата есть блок с основным результатом
if (empty($block[1])) {
$id = $this->get_google_captcha_id($page);
$file = $this->save_google_img($this->get_page("Для просмотра ссылки Войди или Зарегистрируйся"), $id);
do {
$responce = $this->recognize($file, $key); // regonize - функция для отправки капчи, возвращает текст капчи
preg_match_all('/error|waiting|not\sready|timelimit/i', $responce, $matches);
} while (!empty($matches[0][0]));
//unlink($file);
$new_link = $this->google_captcha($id, $link, $responce);
$page = $this->get_page($new_link);
}
} while (empty($block[1]));
$result = $block[1];
return $result;
}

function get_google_captcha_id ($page) {
$regexp = '/img\ssrc\=\"\/sorry\/image\?id\=([0-9]+)/';
preg_match_all($regexp, $page, $matches);
$result = $matches[1][0];
return $result;
}

function google_captcha ($id, $link, $responce) {
$result = $link .'&id='. $id .'&captcha='. $responce .'&submit=Submit';
return $result;
}

function save_google_img ($data, $id_captcha) {
$name = 'tmp/'. time() .'-'. $id_captcha .'.jpg';
file_put_contents($name, $data);
return $name;
}

function save_img ($path) {
$name = 'tmp/'. time() .'-'. rand(0, 9999) .'.jpg';
file_put_contents($name, file_get_contents($path));
return $name;
}

function get_search ($word, $count) {
$result = array();
$key = '';
$word = str_replace(' ', '+', $word);

$link = "Для просмотра ссылки Войди или Зарегистрируйся";
$result['google_ua'] = $this->google_page($this->get_page($link, true), $link, $key);

return $result;
}

print_r(get_search ('test', 20));
?>

// Отправка данных
<form action="Captcha" method="GET">
<input type="hidden" name"***" value="$link" />
<input type="hidden" name="id" value="$id_captcha" />
<input type="text" name="captcha" />
</form>

PS: Очень Вам благодарен, так как выложил этот вопрос не только здесь, а отвечаете только Вы.))
 
С проксями уже писал парсер, тут нужно без них обойтись.
 
  • Заблокирован
  • #18
PHP:
function getAnalyzer($url,$cookieFile) 
{
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, 'FIREFOX 5');
curl_setopt($ch, CURLOPT_TIMEOUT,50); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch,CURLOPT_COOKIEFILE,$cookieFile);
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookieFile);

$answer=curl_exec($ch);

curl_close($ch);
return $answer;
}  
 
function getImageNameRecaptcha(&$result,$cookieFile) {

preg_match('|src="(http://www.google.com/recaptcha/api/challenge.*?)"|is',$result,$url_js); 

$result = getAnalyzer($url_js[1],$cookieFile);

preg_match('|challenge : \'(.*?)\'|is',$result,$url_pic);

return $url_pic[1];
}

function getRecaptcha($cookieFile,$url_pic) {

$picture = getAnalyzer("http://api.recaptcha.net/image?c=".$url_pic, $cookieFile);

return $picture;

}
 
 
 
$urlRecaptchaImage = getImageNameRecaptcha($TEXT,$cookieFile); // $TEXT - ПЕРЕДАЁМ ТЕКСТ ГДЕ НАХОДИТСЯ ГУГЛ КАПЧА ;  $cookieFile - СЕССИЯ ХРАНИТСЯ В КУКИ,ЕЁ ПЕРЕДАЕМ,В ОТВЕТ ПОЛУЧАЕМ НАЗВАНИЕ ИЗОБРАЖЕНИЕ КАПЧИ
 
$captchaCode = getRecaptcha($cookieFile,$urlRecaptchaImage); //  $cookieFile - ПОСЫЛАЕМ СТАРУЮ СЕССИЮ (ЭТО ВАЖНО),  $urlRecaptchaImage - ПОСЫЛАЕМ НАЗВАНИЕ ИЗОБРАЖЕНИЯ КАПЧИ,В ОТВЕТ ПОЛУЧАЕМ ТЕКСТ КАПЧИ.ТЕКСТ СОХРАНЯЕМ ПОД РАСШИРЕНИЕМ .png И ШЛЁМ ИЗОБРАЖЕНИЕ В АНТИГЕЙТ
 
Я извиняюсь, наверное я не так что-то прописал, сделал так как Вы сказали, не выходит.
Картинку сохраняю в .png, но при просмотре Винда ее не может отобразить.
Файл с куками отсутствует.

PHP:
    function get_page ($link, $flag = false) {
        if ($flag === true) @unlink('tmp/cookie.txt');
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $link);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Chrome/16.0.912.75');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_COOKIEFILE, 'tmp/cookie.txt');
        curl_setopt($ch, CURLOPT_COOKIEJAR, 'tmp/cookie.txt');
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
 
    function google_page ($page, $link, $key) {
        do {
            $block = explode('id="res"', $page);
            if (empty($block[1])) {
                $urlRecaptchaImage = $this->getImageNameRecaptcha($page);
                $captchaCode = $this->getRecaptcha($urlRecaptchaImage);
                $file = $this->save_google_img($captchaCode);
                do {
                    $responce = $this->recognize($file, $key);
                    preg_match_all('/error|waiting|not\sready|timelimit/', $responce, $matches);
                } while (!empty($matches[0][0]));
                echo $responce; exit; // Ответ от антигейта.
            }
        } while (empty($block[1]));
        $result = $block[1];
        return $result;
    }
 
    function getImageNameRecaptcha($result) {
        $regexp = '|src="(http://www.google.com/recaptcha/api/challenge.*?)"|is';
        preg_match($regexp, $result, $url_js);
        $result = $this->get_page($url_js[1]);
        $regexp = '|challenge : \'(.*?)\'|is';
        preg_match($regexp, $result, $url_pic);
        return $url_pic[1];
    }
 
    function getRecaptcha($url_pic) {
        $picture = $this->get_page("http://api.recaptcha.net/image?c=".$url_pic);
        return $picture;
    }
 
    function save_google_img ($data) {
        $name = 'tmp/'. time() .'.png';
        file_put_contents($name, $data);
        return $name;
    }
 
$link = "http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=$word&num=$count&hl=ua&start=0"; // Ссылка для поиска
$data = $this->get_page($link, true); // Запрос
$result['google_ua'] = $this->google_page($data, $link, $key); // Проверка на капчу и ее решение
:mad:
А сейчас начало ошибку выдавать:

An error occurred:

Input error: c: Error parsing captcha challenge value
 
Вы допустили сразу несколько ошибок.
Начну по порядку исполнения кода:

1.
PHP:
function get_search ($word, $count) {...
$word = str_replace(' ', '+', $word); // Нужно делать urlencode $word=urlencode($word);
// Тогда заменятся пробелы на '+' но при этом кирилика тоже конвертируется что важно при запросах в кирилике.

2.
PHP:
unction get_google_captcha_id ($page) {
$regexp = '/img\ssrc\=\"\/sorry\/image\?id\=([0-9]+)/';

Простите но что это за сатона ?!?!?!
Сложно читать... Используйте # будит куда проще.
Ставьте лучше пробелы вместо \s читабельнее выглядит. ("Но веть это не правильно !!! - но удобно.")
Экронировать нужно только ограничители шаблона (забыл как называются...) и спец символы. '=' и ковычки это не спец символы.
[0-9] = \d

$regexp = '#img src="/sorry/image\?id=(\d+)#'; - куда понятнее.

3. Для просмотра ссылки Войди или Зарегистрируйся судя по коду утверждает что там рекапча, в рекапче до адреса картинки ещё добраться нужно.
Незнаю.... я немогу вызвать появление капчи хоть убейте...
Если я смогу (когда это будит я незнаю...) посмотреть что и как там при антиботе смогу сказать более точно.
Пока можете принять к сведению выше сказаное.

PS. Сори за опчетки.
 
Назад
Сверху