php парсер Яндекса (количество проиндексированых страниц)

Discussion in 'PHP' started by CRIK0VA, 10 Oct 2012.

  1. CRIK0VA

    CRIK0VA New Member

    Joined:
    18 Sep 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток,

    Подскажите как поступить, не могу допилить парсер.

    Сам я не могу назвать себя пока программистом, опыта не хватает. Есть необходимость сделать парсер количества проиндексированых страниц в Яндексе. Ниже код который по моей логике должен быть. Но он не работает. Голову сломал не понимаю почему. Знающие люди подскажите пожалуйста.

    Снало пытался просто загрузить саму страницу, не грузит.
    PHP:
    $ch curl_init('http://yandex.ru/yandsearch?text=host:google.ru+|+host:www.google.ru&lr=10313');
    //Установка опций
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; ru:1');
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt($chCURLOPT_REFERER'http://rambler.ru');

    curl_exec($ch);

    curl_close($ch);
    Нашел в сети чужой код, и в нем ковыряюсь, то же ничего не выходит.
    PHP:
    class method_curl
    {
        
    // Инициализация curl
        
    function curl_start($url)
        {
            
    $ch curl_init();
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
    curl_setopt($chCURLOPT_FOLLOWLOCATION1); 
            
    curl_setopt($chCURLOPT_CONNECTTIMEOUT20);
            
    curl_setopt($chCURLOPT_ENCODING,'gzip,deflate');
            
    curl_setopt($chCURLOPT_URL$url);
            
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; ru:1");
            
    $data curl_exec($ch);
            
    curl_close($ch);
            return 
    $data;
        }
        
    // Получаем количество страниц в индексе Яндекса
        
    public function yandex_index($site_url)
        {
            
    $content $this->curl_start('http://yandex.ru/yandsearch?date=&text=&spcctx=notfar&zone=all&wordforms=all&lang=all&within=0&from_day=&from_month=&from_year=&to_day=21&to_month=7&to_year=2009&mime=all&site='.urlencode($site_url).'&rstr=&ds=&numdoc=10');
            
    $content str_replace(' тыс.','000',$content);
            
    $content str_replace(' млн','000000',$content);
            
    $content str_replace('ничего не найдено','0',$content);
            
    preg_match('~<title>[^\d]*(\d+)[^\d]*</title>~',$content,$match);
            return 
    $match[1];
        }    
    }
    $url "google.ru";
    echo 
    "Яндекс: ".$analiz->yandex_index($url);
     
    #1 CRIK0VA, 10 Oct 2012
    Last edited: 10 Oct 2012
  2. Skofield

    Skofield Elder - Старейшина

    Joined:
    27 Aug 2008
    Messages:
    960
    Likes Received:
    392
    Reputations:
    58
    В первом коде нужно добавить опцию curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);, и сохранить в переменную результат curl_exec(), если предполагается дальнейшая работа с полученными данными.

    Во втором коде нужно создать объект класса method_curl:
    PHP:
    $analiz = new method_curl;
    $url "google.ru";
    echo 
    "Яндекс: ".$analiz->yandex_index($url);
    Но предполагаю, что регулярка из второго кода уже не актуальна.
     
    #2 Skofield, 11 Oct 2012
    Last edited: 11 Oct 2012
  3. CRIK0VA

    CRIK0VA New Member

    Joined:
    18 Sep 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    PHP:
    $analiz = new method_curl;
    объект создан, просто в коде случайно вырезал.. там ерунды всякой, случайно и это убрал когда публиковал. По поводу регулярки, да, я ее поправил в скрипте, но он мне грузит не страницу со списком индексации, а страницу типо "Ой" вход похожа на автоматический и бла бла и выкидывает капчу. Следовательно нужно наверное продумать подключение с куками или через прокси, или даже не знаю как еще.. то есть простой парсер не доходит до самой страницы результатов индексации
     
  4. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    Используй обертку для CURL https://github.com/shuber/curl , там в архиве README.markdown посмотри, чтобы понять, как составлять запросы с этим классом.
    Вот для примера:
    PHP:
    <?php
    require_once 'curl.php';
    $curl = new Curl;
    $response $curl->get('http://yandex.ru/yandsearch?text=antichat');
    print_r($response->headers);
     
  5. beerhack

    beerhack Elder - Старейшина

    Joined:
    1 Mar 2008
    Messages:
    99
    Likes Received:
    48
    Reputations:
    5
    Я недавно, может месяц назад, пытался сделать такой парсер. Там не всё так просто. Яндекс намудрил там защиту с куками и капчей. Долго мудохался, вроде бы уже и все куки эмулировал, но всё равно результата нужного не добился.
     
  6. Skofield

    Skofield Elder - Старейшина

    Joined:
    27 Aug 2008
    Messages:
    960
    Likes Received:
    392
    Reputations:
    58
    Вот, добавил куки и изменил регексп. Теперь должно работать:
    PHP:
    <?php
     
    class method_curl 

        
    // Инициализация curl 
        
    function curl_start($url
        { 
            
    $ch curl_init(); 
            
    curl_setopt($chCURLOPT_RETURNTRANSFER1); 
            
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);  
            
    curl_setopt($chCURLOPT_CONNECTTIMEOUT20); 
            
    curl_setopt($chCURLOPT_ENCODING,'gzip,deflate'); 
            
    curl_setopt($chCURLOPT_URL$url); 
            
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; ru:1"); 
            
    curl_setopt($chCURLOPT_COOKIEFILE"./cook.txt");
            
    curl_setopt($chCURLOPT_COOKIEJAR"./cook.txt");
            
    $data curl_exec($ch); 
            
    curl_close($ch); 
            return 
    $data
        } 
        
    // Получаем количество страниц в индексе Яндекса 
        
    public function yandex_index($site_url
        { 
            
    $content $this->curl_start('http://yandex.ru/yandsearch?date=&text=&spcctx=notfar&zone=all&wordforms=all&lang=all&within=0&from_day=&from_month=&from_year=&to_day=21&to_month=7&to_year=2009&mime=all&site='.urlencode($site_url).'&rstr=&ds=&numdoc=10'); 
            
    $content str_replace('&nbsp;тыс.','000',$content); 
            
    $content str_replace('&nbsp;млн','000000',$content); 
            
    $content str_replace('ничего не найдено','0',$content); 
            
    preg_match('~<br>(\d+)~',$content,$match); 
            return 
    $match[1]; 
        }     

    $analiz = new method_curl
    $url "google.ru"
    echo 
    "Яндекс: нашлось ".$analiz->yandex_index($url);
    На денвере пробовал? На денвере с cURL'ом какие-то проблемы, куки не сохраняет.
     
    #6 Skofield, 11 Oct 2012
    Last edited: 11 Oct 2012
  7. beerhack

    beerhack Elder - Старейшина

    Joined:
    1 Mar 2008
    Messages:
    99
    Likes Received:
    48
    Reputations:
    5
    нет, не денвер, апач+пхп+мускул по отдельности ставил.
    сразу работает, потом через несколько запросов капча выскакивает и начинаются пляски с бубном
     
  8. Skofield

    Skofield Elder - Старейшина

    Joined:
    27 Aug 2008
    Messages:
    960
    Likes Received:
    392
    Reputations:
    58
    Значит прокси нужно использовать.
     
  9. nsz

    nsz New Member

    Joined:
    18 May 2012
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Яндекс примерно после 50 запросов первый раз предлагает капчу ввести, вводил в ручную, куки потом подставлял. Но потом, после 10-15 запросов опять просили капчу ввести, и понял я, нечего на яндексе ловить и пошел в гугл и яху.ком, там почему-то ботов не боятся) От прокси мало толку будет, если запросов много, то их(проксей) соответственно тоже нужно будет много.
     
  10. CRIK0VA

    CRIK0VA New Member

    Joined:
    18 Sep 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Выкидывает капчу сразу.. (то есть не грузится нужная страница, а опять та же с капчей. Файл кукисов создался и имеет данные, но это не помогает к сожалению.) Можно как то обойти это дело..? Прокси может использовать..?
     
  11. CRIK0VA

    CRIK0VA New Member

    Joined:
    18 Sep 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    В общем пробовал и с прокси, тоже выкидывает мне страницу с капчей((
     
  12. Skofield

    Skofield Elder - Старейшина

    Joined:
    27 Aug 2008
    Messages:
    960
    Likes Received:
    392
    Reputations:
    58
    На чем запускаешь скрипт? Хотя бы несколько запросов должно без капчи обработать. Какая версия cURL'а установлена?
    У меня все нормально открывает.
     
  13. CRIK0VA

    CRIK0VA New Member

    Joined:
    18 Sep 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    на обычном хостинге.. версия курла

    cURL support enabled
    cURL Information libcurl/7.19.7 OpenSSL/0.9.8m zlib/1.2.3
     
  14. CRIK0VA

    CRIK0VA New Member

    Joined:
    18 Sep 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Кстати получилось первый раз подгрузить через прокси очередной... Ура.. Спасибо.. проблема в том что забыл удалить куки когда заходил без прокси...
     
  15. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Если пишите для себя, рекомендую: http://xml.yandex.ru/