Массовая проверка Proxy !

Тема в разделе "PHP Pro", создана пользователем Inviseble_Demon, 21 мар 2009.

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

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Доброго всем времени суток.
    Вот наваял функцию тестирования прокси (Функция проверки прокси на роботоспособность, на доступность GET и отсутствие бана на yandex).

    Вроде прикрасно работает но... НУЖЕН мульти курл. Иначе из-за тормазов проксей все тянеца ну очень долго а так в 20-50 потоков (хоть и псевдо) пустить будит думаю намного быстрее )).

    Проблемма в том что с курлами дела у меня плохи а по статьям с мультиком так и не разобрался ((. Прошу помощи у Вас. В итоге если допишем данную функцию она многи понадобиться и поможет !

    PHP:
    <?PHP 
    function test_proxy($proxy)  // Функция проверки прокси на роботоспособность, на доступность GET и отсутствие бана на yandex. 
        

            
    $rand=rand(2345678,23456789023456789087654); 
            
    $url "http://yandex.ru/yandsearch?text=$rand"
            
    $ua "Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)"
            
    $ch curl_init(); 
             
            
    curl_setopt($chCURLOPT_USERAGENT$ua); 
            
    curl_setopt($chCURLOPT_URL$url); 
            
    curl_setopt($chCURLOPT_TIMEOUT5);  
            
    curl_setopt($chCURLOPT_CONNECTTIMEOUT5); 
            
    curl_setopt($chCURLOPT_RETURNTRANSFER,1); 
            
    curl_setopt($chCURLOPT_PROXY$proxy); 

            
    $result curl_exec($ch); 
            if (
    preg_match("#$rand#"$result)){return true;} 
            else {return 
    false;} 
         
        } 
    ?>
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Если я правильно понял, задача состоит в обдирании контента, а чтобы не забанили, привлекаются многочисленные прокси, которые могут отвалиться в любой момент.

    Вот простенький пример обдирания с помощью мульти curl:

    Код:
    // создание двух cURL
    $ch1 = curl_init(); $ch2 = curl_init();
     
    // установка параметров
    curl_setopt($ch1, CURLOPT_URL, "http://superpuper.ru/");
    curl_setopt($ch2, CURLOPT_URL, "http://superpuper2.ru/");
    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
     
    $mh = curl_multi_init();
    curl_multi_add_handle($mh,$ch1);
    curl_multi_add_handle($mh,$ch2);
     
    $running=null;
    do {
        curl_multi_exec($mh,$running);
    } while ($running > 0);
     
    $data1 = curl_multi_getcontent($ch1);
    $data2 = curl_multi_getcontent($ch2);
     
    curl_multi_remove_handle($ch1);
    curl_multi_remove_handle($ch2);
    curl_multi_close($mh);
    Далее надо распланировать задачу. Есть массив проксей, есть массив урлов страниц, которые надо ободрать. Делаем цикл. В цикле постепенно убираем из массива проксей те прокси, которые отмирают. Подкачиваем массив проксей извне, если все сдохли. В массиве урлов метим успешно скачанные урлы. Делаем цикл до тех пор, пока все урлы не будут скачены.

    По поводу тестирования прокся яндексом. Я бы сначала тянул урл через проксю, затем анализировал бы то что стянул. Если что-то не понравилось, тогда тестируется прокся через яндекс. Если прокся оказалась живой, значит, что-то с тянутой страницей.
     
    Alternator и Inviseble_Demon нравится это.
  3. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    вот, довел до ума чекер многопоточный.
    UPD в связи с моими постоянно пополняющимеся знаниями был совершен апгрейд.
    во первых теперь мне стало ясно, что более 100 потоков на один URL сам judge не выдерживает, и отвечает с задержкой вплоть до 5 секунд при этом(в штатном режиме ответ от него за 150 милисекунд приходит)
    во вторых, скрипт теперь не грузит проц на 100%, как предыдшая версия
    суть замены
    PHP:
        $running=null;
        do
            
    curl_multi_exec($mh,$running);
        while(
    $running>0);
    //поменял на 
        
    $active null;
        do
            
    $mrc curl_multi_exec($mh$active);
        while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        while (
    $active && $mrc == CURLM_OK)
        if ((
    $qwe=curl_multi_select($mh,1)) != -1)
            do
                
    $mrc curl_multi_exec($mh$active);
            while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
    собственно чекер:
    PHP:
    <?
    define("_THREAD",    100);//больше 100 потоков этот URL не выдерживает эффективно
    define("_TRY",        1);//по поводу нескольких попыток, что-то я заглючил с multiCURL-ом, поэтому не трогаем
    define("_URL",        "http://zerg.helllabs.net/cgi-bin/textenv.pl");
    define("_TIME",        40);//+ 5-10 секунд по сравнению с тем, что нам надо

    //--------------------------------------------------------------------------------
    error_reporting(E_ALL);
    set_time_limit(0);
    ignore_user_abort(TRUE);
    ob_implicit_flush();
    //--------------------------------------------------------------------------------
    //$fpi=fopen('2check.txt','r');
    $fpi=fopen('_2check(x20).txt','r');//файл для чека
    //$fpo=fopen('checked.txt','w');
    $fpo=fopen('checked.txt','a');//сюда складываются все прокси
    $fpc=fopen('CoDeeN.txt','a');//а сюда все CoDeeN-прокси

    $count=0;
    $i=0;
    $mh=curl_multi_init();
    $ch=array();
    $proxy=array();
    while(!
    feof($fpi))
        {
        
    $proxy[$i]=trim(fgets($fpi4096));
        
    $ch[$i]=curl_init();
        
    //curl_setopt($ch[$i],CURLOPT_URL,"http://ya.ru");    
        
    curl_setopt($ch[$i],CURLOPT_URL,_URL);    
        
    curl_setopt($ch[$i],CURLOPT_RETURNTRANSFER,1);
        
    curl_setopt($ch[$i],CURLOPT_CONNECTTIMEOUT,_TIME);
        
    curl_setopt($ch[$i],CURLOPT_TIMEOUT,_TIME);
        
    curl_setopt($ch[$i],CURLOPT_PROXY,$proxy[$i]);
        
    curl_multi_add_handle($mh,$ch[$i]);
        
    $i++;
        if(
    $i==_THREAD)
            {
            for(
    $j=0;$j<_TRY;$j++)
                
    check($mh,$ch,$proxy);
            for(
    $j=0;$j<_THREAD;$j++)
                
    curl_multi_remove_handle($mh,$ch[$j]);
            
    curl_multi_close($mh);
            
    $i=0;
            
    $mh=curl_multi_init();
            
    $ch=array();
            
    $proxy=array();
            echo (++
    $count)."\n";
            }
            
        }

    function 
    check(&$mh,&$ch,&$proxy)
        {
        global 
    $fpo,$fpc;
        
    curl_multi_exec($mh,$running);

        
    $active null;
        do
            
    $mrc curl_multi_exec($mh$active);
        while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        while (
    $active && $mrc == CURLM_OK)
        if ((
    $qwe=curl_multi_select($mh,1)) != -1)
            do
                
    $mrc curl_multi_exec($mh$active);
            while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
        
    /*такая конструкция почему-то грузит проц в отличии от предыдущей
        do
            {
            curl_multi_exec($mh,$running);
            }
        while($running>0);
        */
        
        
        
    for($j=0;$j<_THREAD;$j++)
            {
            
    $data=curl_multi_getcontent($ch[$j]);
            
    $temp=curl_getinfo($ch[$j]);
            if(
    $data!='')//довольно сомнительная проверка, но она выделяет  всех тех, что хотя бы ответил
                
    {
                if(
    strpos($data,"CoDeeN")!==FALSE)//CoDeen
                    
    {
                    
    fwrite($fpc,$proxy[$j]."\r\n");
                    }
                else
                    {
                    
    fwrite($fpo,$proxy[$j]."\r\n");
                    }
                }
            }
        }


    fclose($fpi);
    fclose($fpo);
    ?>
     
    latteo, Zahar, AsanBosam и ещё 1-му нравится это.
Статус темы:
Закрыта.