Неверно парсится капча

Тема в разделе "PHP Pro", создана пользователем bugargen, 24 дек 2010.

Статус темы:
Закрыта.
  1. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Хочу спарсить капчу, но почему-то спарсенная капча отличается от исходной.

    Вот код:
    PHP:
    <?php

    $ch 
    curl_init ();

    curl_setopt $chCURLOPT_URL'http://conversion.7search.com/scripts/advertisertools/keywordsuggestion.aspx' );
    curl_setopt $chCURLOPT_FOLLOWLOCATION);
    curl_setopt $chCURLOPT_RETURNTRANSFER);
    curl_setopt $chCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13' );
    curl_setopt $chCURLOPT_REFERER'http://conversion.7search.com/scripts/advertisertools/keywordsuggestion.aspx' );
    curl_setopt $chCURLOPT_COOKIEFILEdirname (__FILE__) . '/cookie.txt' );
    curl_setopt $chCURLOPT_COOKIEJARdirname (__FILE__) . '/cookie.txt' );

    $html curl_exec $ch );

    echo 
    $html;

    preg_match '|src="(http://api.recaptcha.net/noscript\?k=.+?)"|'$html$out );

    curl_setopt $chCURLOPT_URL$out[1] );

    $html curl_exec $ch );

    preg_match '|src="(image\?c=.+?)"|'$html$out );

    echo 
    '<img src="http://api.recaptcha.net/' $out[1] . '" />';

    curl_close $ch );

    ?>
    Уж измучался весь. Инет читал-перечитывал. Вроде всё по понятиям, но ведь всё-равно генерится новая капча.
     
  2. mcdir

    mcdir

    Регистр.:
    6 ноя 2007
    Сообщения:
    202
    Симпатии:
    37

    э хитрый какой ))
    в два тыка делать нуна)))
    качаешь страницу
    сохраняешь куки и др
    ищешь на странице ссылку на капчу
    и куки + ссылка = тебе дают реальную капчу с страницы
     
  3. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Ну так я всё так и делаю. "По учебнику" :) НО, судя по твоим словам, проблема только в том, что последний мой запрос с выдранной ссылкой идёт не с той кукой? А как, в данном случае, через CURL послать то что нужно??? Нигде такого не нашёл...
    Считал, что
    PHP:
    curl_setopt $chCURLOPT_FOLLOWLOCATION);
    curl_setopt $chCURLOPT_COOKIEFILEdirname (__FILE__) . '/cookie.txt' );
    curl_setopt $chCURLOPT_COOKIEJARdirname (__FILE__) . '/cookie.txt' );
    является достаточным для того, чтобы кука на менялась и в случае LOCATION по нему осуществлялся переход.
     
  4. mcdir

    mcdir

    Регистр.:
    6 ноя 2007
    Сообщения:
    202
    Симпатии:
    37

    ты должен полностью эмулировать браузер
    1 запрос - страница (кука+сессия+версия браузера и т.п)
    2 запрос - капча с этой страницы (кука+сессия+версия браузера и т.п)


    в качестве обучения см firebug раздел сеть
    должно помочь
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.517
    Симпатии:
    1.365
    В скрипте не учтено, что
    PHP:
    http://conversion.7search.com/scripts/advertisertools/keywordsuggestion.aspx
    делает редирект на
    PHP:
    http://conversion.7search.com/scripts/advertisertools/login.aspx?msgid=1&nextpage=http%3a%2f%2fconversion.7search.com%2fscripts%2fadvertisertools%2fkeywordsuggestion.aspx
    - который и посылается в качестве реферера на рекапчу.

    PS Когда нечто сетевое пишешь - юзай снифферы Перейти по ссылке или firebug. Первый удобнее - на него можно трафик от скрипта завернуть
    PHP:
    curl_setopt $chCURLOPT_PROXY"127.0.0.1:8888");
     
  6. bugargen

    bugargen

    Регистр.:
    24 апр 2008
    Сообщения:
    232
    Симпатии:
    19
    Оказывается, вывод результатов на экран - это равноценно новому запросу капчи (логично), а получение результатов через curl_exec - нет (нихрена не логично). В этом и была загвоздка. Так что, почему curl_exec получает информацию, не делая при этом запроса на новую капчу (в контексте данной задачи), я так и не понял.
     
  7. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    Собственно, не понятно, что тут не понятно? ;)

    Выводя результат на экран, бразуер!!! сам запрашивает картинку. Рекаптча смотрит, что куков и реферера нет (а их и правда нет - они курлом были получены) и выдает новую.

    А сам-то курл картинку не грузит при получении html-кода страницы. Поэтому и получаешь старую каптчу.
     
    bugargen нравится это.
Статус темы:
Закрыта.