Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   PHP парсер + демон (https://forum.antichat.xyz/showthread.php?t=125387)

[NiGHT]DarkAngel 15.06.2009 15:55

PHP парсер + демон
 
Есть парсер на 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 ключевых слов и обрабатывать их паралельно ... Зарание благодарю за помошь ...

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

mailbrush 15.06.2009 15:59

Код не смотрел, но скажу - многопоточности, как таковой, в ПХП нету.

mr.The 15.06.2009 16:27

Цитата:

Код не смотрел, но скажу - многопоточности, как таковой, в ПХП нету.
Код не смотрел, но скажу - можно много потоков(запросов) обработать самим курлом. Ну а потом уже, в один поток отпарсить результаты. Правда поисковики нелюбят много запросов. Гугл особенно.

[NiGHT]DarkAngel 15.06.2009 16:33

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

[NiGHT]DarkAngel 15.06.2009 16:46

Если использовать мулти курл ... то получится такая ситуация ... я сгенерю пать страничек ... он их все получит ~ 250 Кб ... а нужный мне домен находиться на первой странничке .... получается все остальное он зря грузил ...

login999 15.06.2009 16:59

Ты сам то понял, чего хочешь ?
Вот тебе код на Python, надеюсь поймёшь
Код:

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

Вот то что тебе нужно

mr.The 15.06.2009 17:03

Цитата:

я сгенерю пать страничек ... он их все получит ~ 250 Кб ... а нужный мне домен находиться на первой странничке .... получается все остальное он зря грузил ...
тебе настолько жалко трафа? тогда либо юзай сторонние сервисы, либо другие языки.


Время: 01:09