Парсинг яндекс поисковика. PHP

Discussion in 'PHP' started by jFry, 21 Jun 2015.

  1. jFry

    jFry New Member

    Joined:
    21 Jun 2015
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Приветствую всех.
    Я хочу спарсить поисковую выдачу по разным фразам в яндексе, но вот только яндекс все не хочет поверить, что я человек и требует от скрипта капчу.
    Использую curl. Куки включены.
    Немного поэкспериментировав я понял, что яндексу важна кука "spravka". Если ее удалить, то появится капча при следующем запросе.
    Пробовал вручную записывать этот параметр в куку, но все равно яндекс не пускает меня.
    Про яндекс XML в курсе, но мне это не подходит.

    Подскажете куда копать?
     
  2. polig2

    polig2 Member

    Joined:
    9 May 2015
    Messages:
    98
    Likes Received:
    17
    Reputations:
    0
    немного в другую сторону,
    ты можешь это сделать на qt c++ на эмуляции браузера qwebkit.
     
  3. jFry

    jFry New Member

    Joined:
    21 Jun 2015
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Не подходит, нужно легкое решение.

    Проблема частично решена. Если некоторое время с IP не поступают запросы, то капча пропадает. Остается выяснить как часто можно делать запросы, чтобы она не появлялась.
     
  4. jFry

    jFry New Member

    Joined:
    21 Jun 2015
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Разобрался частично. Яндексу важны вот эти две куки: Session_id и fuid01. Если их вручную подменить, то запросы отлично проходят.
     
    #4 jFry, 22 Jun 2015
    Last edited: 22 Jun 2015
  5. polig2

    polig2 Member

    Joined:
    9 May 2015
    Messages:
    98
    Likes Received:
    17
    Reputations:
    0
    Выложи сюда исходный код.
     
  6. jFry

    jFry New Member

    Joined:
    21 Jun 2015
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Исходный код передачи капчи.

    Вот что яндекс мне выдает
    <!DOCTYPE HTML><html class="i-ua_js_no i-ua_css_standard"><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Ой!</title><script>;(function(d,e,c,r,n,w,v,f){e=d.documentElement;c="className";r="replace";n="createElementNS";f="firstChild";w="http://www.w3.org/2000/svg";e[c]+=" i-ua_svg_"+(!!d[n]&&!!d[n](w,"svg").createSVGRect?"yes":"no");v=d.createElement("div");v.innerHTML="<svg/>";e[c]+=" i-ua_inlinesvg_"+((v[f]&&v[f].namespaceURI)==w?"yes":"no");})(document);;(function(d,e,c,r,n,w,v,f){e=d.documentElement;c="className";r="replace";n="createElementNS";f="firstChild";w="http://www.w3.org/2000/svg";e[c]+=!!d[n]&&!!d[n](w,"svg").createSVGRect?" i-ua_svg_yes":" i-ua_svg_no";v=d.createElement("div");v.innerHTML="<svg/>";e[c]+=(v[f]&&v[f].namespaceURI)==w?" i-ua_inlinesvg_yes":" i-ua_inlinesvg_no";})(document);;(function(d,e,c,r){e=d.documentElement;c="className";r="replace";e[c]=e[c][r]("i-ua_js_no","i-ua_js_yes");if(d.compatMode!="CSS1Compat")e[c]=e[c][r]("i-ua_css_standart","i-ua_css_quirks")})(document);</script><!--[if gt IE 9]><!--><link rel="stylesheet" href="/captcha/_common.css"/><!--<![endif]--><!--[if IE 6]><link rel="stylesheet" href="/captcha/_common.ie6.css"/><![endif]--><!--[if IE 7]><link rel="stylesheet" href="/captcha/_common.ie7.css"/><![endif]--><!--[if IE 8]><link rel="stylesheet" href="/captcha/_common.ie8.css"/><![endif]--><!--[if IE 9]><link rel="stylesheet" href="/captcha/_common.ie9.css"/><![endif]--></head><body class="b-page i-ua i-ua_interaction_yes b-page__body i-global i-bem" data-bem="{&quot;b-page&quot;:{},&quot;i-ua&quot;:{},&quot;i-global&quot;:{&quot;lang&quot;:&quot;ru&quot;,&quot;tld&quot;:&quot;ru&quot;,&quot;content-region&quot;:&quot;ru&quot;,&quot;click-host&quot;:&quot;//clck.yandex.ru&quot;,&quot;passport-host&quot;:&quot;https://passport.yandex.ru&quot;,&quot;pass-host&quot;:&quot;//pass.yandex.ru&quot;,&quot;social-host&quot;:&quot;//social.yandex.ru&quot;,&quot;export-host&quot;:&quot;//export.yandex.ru&quot;,&quot;lego-static-host&quot;:&quot;//yastatic.net/lego/2.10-152&quot;}}"><div class="i-expander__gap"></div><div class="i-expander__content"><div class="island island_type_fly"><div class="badge"><div class="logo logo_lang_ru"><a class="logo__link" href="//www.yandex.ru"><img class="logo__image" alt="Яндекс" src="//yastatic.net/lego/_/La6qi18Z8LwgnZdsAr1qy1GwCwo.gif"/></a></div></div><div class="content"><h1 class="title">ой...</h1><div class="text">
    <p>Нам очень жаль, но&nbsp;запросы, поступившие с&nbsp;вашего IP-адреса, похожи на&nbsp;автоматические.
    По&nbsp;этой причине мы&nbsp;вынуждены временно заблокировать доступ к&nbsp;поиску.</p>
    <p>Чтобы&nbsp;продолжить поиск, пожалуйста, введите символы с&nbsp;картинки в&nbsp;поле ввода и&nbsp;нажмите &laquo;Отправить&raquo;.</p>
    <p class="b-hidden"><i class="icon icon_alert_yes"></i>
    <b>В вашем браузере отключены файлы cookies</b>. Яндекс не сможет запомнить вас и правильно идентифицировать в дальнейшем. Чтобы включить cookies, воспользуйтесь советами на <a class="link" target="_blank" href="//help.yandex.ru/common/?id=1111120">странице нашей Помощи</a>.
    </p></div><div class="form form_state_image form_error_no form_audio_yes i-bem" data-bem="{&quot;form&quot;:{&quot;flash&quot;:&quot;/captcha/soundmanager2.swf&quot;,&quot;sound&quot;:&quot;http://yandex.ru/captcha/voice?aHR0...1802ee056cce_f76a7aaa2b82c86dc20ece62b50b1a4a&quot;,&quot;soundIntro&quot;:&quot;http://yandex.ru/captcha/voiceintro...1802ee056cce_435d20195cfb0c6c65d902fdd74e23e5&quot;,&quot;buttonPlay&quot;:&quot;Произнести&quot;,&quot;buttonPlaying&quot;:&quot;Воспроизводится&quot;}}"><form class="form__inner" method="get" action="/checkcaptcha"><input class="form__key" type="hidden" name="key" value="c30Qe9KLQCA1djVw5uL79rjueABjbNbb_0/1435510223/1733a1a79785261da10c1802ee056cce_aa329af11493ee2d19a38e4cb426a23e"/><input class="form__retpath" type="hidden" name="retpath" value="http://yandex.ru/search?text=скачать+minecraft&amp;p=1_68c3d22db217fcb7ad97633d12eb102c"/><div class="form__trigger" title="Изображение &#8596; Звук" role="button" tabindex="0" aria-label="Изображение &#8596; Звук"></div><span class="link form__refresh" title="Показать другую картинку" aria-label="Показать другую картинку" role="button" tabindex="0"></span><img class="image form__captcha" style="background: #cfcfcf;" src="http://yandex.ru/captchaimg?aHR0cDo...1802ee056cce_9423ea76a1752a34b8183ad5074a34cf" alt=""/><div class="form__audio"><button class="button button_size_m button_type_play button_theme_normal form__play i-bem" role="button" type="button" data-bem="{&quot;button&quot;:{}}"><span class="button__text">Произнести</span></button></div><div class="form__arrow">→</div><span class="input input_size_m input_clear_no input_keyboard_yes input_theme_normal form__input i-bem" data-bem="{&quot;input&quot;:{&quot;autoFocus&quot;:true,&quot;live&quot;:false}}"><label class="input__hint input__hint_visibility_visible" id="hintuniq14183119996922" for="uniq14183119996922" aria-hidden="true">символы слева</label><span class="input__box"><input class="input__control i-bem" id="rep" name="rep" data-bem="{&quot;input__control&quot;:{}}"/></span><span class="b-keyboard-loader b-keyboard-loader_type_search b-keyboard-loader_lang_ru i-bem" data-bem="{&quot;b-keyboard-loader&quot;:{&quot;for&quot;:&quot;#rep&quot;}}"><img class="image b-keyboard-loader__keyboard" src="//yastatic.net/lego/_/La6qi18Z8LwgnZdsAr1qy1GwCwo.gif" alt=""/></span></span><button class="button button_size_m button_side_right button_theme_normal form__submit i-bem" role="button" type="submit" data-bem="{&quot;button&quot;:{}}"><span class="button__text">Отправить</span></button></form></div></div><div class="why"><h2 class="why__title">Почему так случилось?</h2>
    <p>Возможно, автоматические запросы принадлежат не вам, а другому пользователю, выходящему в сеть с одного с вами IP-адреса.
    Вам необходимо один раз ввести символы в форму, после чего мы запомним вас и сможем отличать от других пользователей, выходящих с данного IP.
    В этом случае страница с капчей не будет беспокоить вас довольно долго.</p>
    <p>Возможно, в вашем браузере установлены дополнения, которые могут задавать автоматические запросы к поиску. В этом случае рекомендуем вам отключить их.</p>
    <p>Также возможно, что ваш компьютер заражен вирусной программой, использующей его для сбора информации.
    Может быть, вам стоит проверить систему на наличие вирусов, например, антивирусной утилитой <a class="link" target="_blank" href="http://www.freedrweb.com/?lng=ru">CureIt</a> от «Dr.Web».</p>
    <p>Если у вас возникли проблемы или вы хотите задать вопрос нашей службе поддержки, пожалуйста, воспользуйтесь
    <a class="link" href="//feedback2.yandex.ru/captcha/">формой обратной связи</a>.
    </p>
    </div><div class="note"><p>
    Если автоматические запросы действительно поступают с вашего компьютера, и вы об этом знаете (например, вам по роду деятельности необходимо отправлять Яндексу
    подобные запросы), рекомендуем воспользоваться специально разработанным для этих целей сервисом
    <a class="link" href="//xml.yandex.ru">Яндекс.XML</a>.
    </p></div></div></div><div class="popup popup_theme_ffffff popup_color_error popup_autoclosable_yes popup_adaptive_yes popup_animate_yes"><div class="popup__under"></div><i class="popup__tail"></i><div class="popup__content">Неверно, попробуйте ещё раз.</div></div><script src="//yastatic.net/jquery/1.8.3/jquery.min.js"></script><script src="/captcha/soundmanager2.min.js"></script><script src="/captcha/_common.ru.js"></script>
    <!-- Yandex.Metrika counter --><script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter10630330 = new Ya.Metrika({id:10630330, webvisor:true, clickmap:true, trackLinks:true, accurateTrackBounce:true, ut:"noindex"}); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/10630330?ut=noindex" style="position:absolute; left:-9999px;" alt="" /></div></noscript><!-- /Yandex.Metrika counter -->
    </body></html>

    Отсюда беру две переменные и сам текст с капчей:
    PHP:
    $key 'c30Qe9KLQCA1djVw5uL79rjueABjbNbb_0/1435510223/1733a1a79785261da10c1802ee056cce_aa329af11493ee2d19a38e4cb426a23e';
    $retpath 'http://yandex.ru/search?text=%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C+minecraft&amp;p=1_68c3d22db217fcb7ad97633d12eb102c';
    $rep 'танцзал';
    И пытаюсь через CURL отдать капчу :
    PHP:
    $curl curl_init();
    curl_setopt($curlCURLOPT_COOKIESESSIONtrue);
    curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
    curl_setopt($curlCURLOPT_FOLLOWLOCATIONtrue);
    curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($curlCURLOPT_COOKIEJAR$HOMEDIR.'/cookie/cookies_yandex.txt');
    curl_setopt($curlCURLOPT_COOKIEFILE$HOMEDIR.'/cookie/cookies_yandex.txt');

    curl_setopt($curlCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36');


    curl_setopt($curlCURLOPT_URL'http://yandex.ru/checkcaptcha?key='.$key.'&rep='.$rep.'&retpath='.$retpath);

    $html curl_exec($curl);
    В итоге яндекс говорит, что такой страницы нет. В чем проблема?
     
  7. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Куки точно работают?
    и возможно реферер проверяется
    А еще не плохо было бы проверить именно снифером куда отсылается разгаданная капча. В коде может быть одно а на деле другое, замена на лету может быть при помощи JS
     
  8. jFry

    jFry New Member

    Joined:
    21 Jun 2015
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Да, куки точно работают. Уже разобрался. Там надо было вот это с переменными сделать:
    PHP:
    $retpath html_entity_decode($retpath);
    $retpath urlencode($retpath);
    $key urlencode($key);
    и все сразу заработало.

    По поводу проверки куда шлются запросы, я это первым делом проверял через firebug. Уже сталкивался с подобными загадками от яндекса, когда вордстат парсил :)