PHP парсер + демон

Discussion in 'PHP' started by [NiGHT]DarkAngel, 15 Jun 2009.

  1. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Есть парсер на php

    PHP:


    {
            
    /*Сколько страниц парсим*/
            
    $max_str=5;
            
    /*Начальная позиция*/
            
    $cur_str=0;
            
    /*Флаг о том что ненайдена позиция*/
            
    $found=false;

            
    //Преобразуем ключевик для яндекса
        
    $keyword_enc urlencode($key_word);

        
    //Инициализируем счетчик
        
    $position 0;

            
    /*Список прокси серверов для парсинга*/
            
    $proxy=Array();

         
    //Формируем Cookie для региона
        
    $cookie="";

        while((
    $cur_str<$max_str) && ($found!=true))
            {
             
             
    $i_proxy rand(0,5)+1;

             
    $content="";

             
    $ch curl_init("http://yandex.ru/yandsearch?p=$cur_str&text=$keyword_enc");

             
    $curlOptions = array(CURLOPT_HEADER => 0,
                                              
    CURLOPT_NOBODY => 0,
                             
    CURLOPT_VERBOSE => 1,
                           
    CURLOPT_RETURNTRANSFER => 0,
                          
    CURLOPT_FOLLOWLOCATION => 0,
                          
    CURLOPT_POST => 0,
                          
    CURLOPT_PROXY=>$proxy[$i_proxy],
                          
    CURLOPT_COOKIE => $cookie,
                          
    CURLOPT_POSTFIELDS => $queryBody);

             
    $content position::curl_connect($curlOptions,$ch);

             if(
    $content!="")
             {
              
    $total=preg_match_all('#.*<a tabindex="(.*?)" onmousedown="(.*?)" href="(.*?)" target="(.*?)">.#i'$content$forms );
              
    $cur_match=0;

              
    //echo $content."<br>";

              //echo "Total = ".$total."<br>";
              
    while($cur_match!=$total)
              {
               
    $position++;

               
    $tmp=preg_match('#http://(.*?)/#i',$forms[3][$cur_match],$domains);

               if(
    substr($domains[1],0,4) == "www.")
               {
                
    $cur_domain substr($domains[1],4,strlen($domains[1]));
               }
               else
               {
                   
    $cur_domain $domains[1];
               }

            
               if(
    $cur_domain==$site_domain)
               {
                   
    $found=true;
                 break;
               }
               
    $cur_match++;
              }
             }
            
    $cur_str++;
           }

           if(
    $found==false)
           {
               
    $position 0;
           }

           return 
    $position;
        }
    Функция curl_connect
    PHP:
        function curl_connect($curlOptions,$ch)
        {
           
    /*Устанавливаем опции для curl*/
           
    curl_setopt_array($ch$curlOptions);

           
    /*Инициализируем буфер вывода*/
           
    ob_start();

           
    /*Получаем страничку*/
           
    curl_exec($ch);

           
    /*Заносим значения буфера в переменную*/
           
    $content ob_get_contents();

           
    /*Закрываем соединение curl'a*/
           
    curl_close($ch);

           
    /*Очищаем буфер*/
           
    ob_end_clean();

           return 
    $content;
        }
    Бегает он получает странички,собирает позиции :) работает вообщем как надо... но одно НО , уж слишком медленно все и долго занимается время парсить допустим около 1000 слов ... хотелось бы узнать есть какие-то способы сделать многопоточным этот процесс и демонизировать ... ну про демонизацию я нашел инфу, читаю ... а вот с многопоточностью не ясно ... вариант это делать или нет ... на данный момент он берет из базы по 1 слову и ишет в яндексе его , если поставить например 5 слов за раз ... то это уже получается большая нагрузка на сервер и скрипт не успевает обработаться и вываливается ошибка о времени выполнения скрипта,set_time_limit(0) не помогает ... да и все равно это будет очень и очень долго ... соответственно задача вот в чем ... хотелось бы например брать сразу по 10-20 ключевых слов и обрабатывать их паралельно ... Зарание благодарю за помошь ...

    ЗЫ За код прошу сильно не бить , только учусь :)
     
  2. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Код не смотрел, но скажу - многопоточности, как таковой, в ПХП нету.
     
  3. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    Код не смотрел, но скажу - можно много потоков(запросов) обработать самим курлом. Ну а потом уже, в один поток отпарсить результаты. Правда поисковики нелюбят много запросов. Гугл особенно.
     
  4. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    ну для этого в курле есть параметр прокси ... и при каждом запросе страничке можно подменить ип... сообственно говоря так это и работает
     
  5. [NiGHT]DarkAngel

    [NiGHT]DarkAngel Elder - Старейшина

    Joined:
    29 Mar 2005
    Messages:
    131
    Likes Received:
    40
    Reputations:
    16
    Если использовать мулти курл ... то получится такая ситуация ... я сгенерю пать страничек ... он их все получит ~ 250 Кб ... а нужный мне домен находиться на первой странничке .... получается все остальное он зря грузил ...
     
  6. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Ты сам то понял, чего хочешь ?
    Вот тебе код на Python, надеюсь поймёшь
    Code:
    import urllib
    def Telepat(domain):
        data = urllib.urlopen("http://mind.yandex.ru").read()
        page_number = get_domain_postion_page(data)
        return page_number
    
    Pos = Get_Postion(page_number)
    print Pos
    
    Вот то что тебе нужно
     
  7. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    тебе настолько жалко трафа? тогда либо юзай сторонние сервисы, либо другие языки.
     
    1 person likes this.