Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Помогите с CURLOPT_PROXY
цитата
20/04/19 в 12:44
 saimonyz
есть скрипт на php, он подключается к сайту через прокси, помогите сделать что бы CURLOPT_PROXY переключал их автоматом или брал по очереди, или крутил их каждые 1-5 мин...

$proxy = 'socks5://user:pass@127.0.0.0:3128'; 1
$proxy = 'socks5://user:pass@127.0.0.0:3128'; 2
$proxy = 'socks5://user:pass@127.0.0.0:3128'; 3
$proxy = 'socks5://user:pass@127.0.0.0:3128'; 4
curl_setopt($this->ch, CURLOPT_PROXY, $proxy);
цитата
22/04/19 в 06:04
 localhost
ну так в чем же сложности?



#список проксей в файле proxy.list

1="socks5://user:pass@127.0.0.0:3128"
2="socks5://user:pass@127.0.0.0:3128"
3="socks5://user:pass@127.0.0.0:3128"
4="socks5://user:pass@127.0.0.0:3128"

# список юзер_агентов в файле user.agents
#user agents:
1="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
2="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
3="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
4="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
#------------------

$proxy=parse_ini_file("proxy.list");
$user_agents=parse_ini_file("user.agents");
$_cookie="путь до куков";

function curl_fetch($url,&$proxy=array()){
    global $_cookie,$user_agents;

    shuffle($user_agents);

    #вариант1: рандомно
    shuffle($proxy);
    $current_proxy=$proxy[0];

    #вариант 2: последовательно:
    $current_proxy=each($proxy);
    if($current_proxy==null) {
         reset($proxy);
         $current_proxy=each($proxy);
    }
   
    $c=curl_init();
    curl_setopt($c,CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
    curl_setopt($c,CURLOPT_USERAGENT,$user_agents[0]);
    curl_setopt($c,CURLOPT_URL,$url);
    curl_setopt($c,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($c,CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($c,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($c,CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($c,CURLOPT_COOKIEJAR,$_cookie);
    curl_setopt($c,CURLOPT_COOKIEFILE,$_cookie);
    curl_setopt($c,CURLOPT_TIMEOUT,30);
    curl_setopt($c,CURLOPT_VERBOSE,0);
    $html=curl_exec($c);
    $c=curl_getinfo($c,CURLINFO_HTTP_CODE);
    if($c!=200) return("={$c};{$url}");
    return($html);
}
#----------------------------------
function curl_error_msg(&$c){
   if($c[0]!='=') return(true);
   $v=explode(";",$c);
   $code=str_replace('=','',$v[0]);
   _err("CURL ERROR :: CODE = {$code}\n");
   return(false);
}



сам цикл:
#простой способ - есть подготовленный $urls со списком урлов
#исключаем дубли:
$visited=array();
#список плохих урлов:
$bad=array();

foreach($urls as $url){
   if(isset($visited[$url])) continue;
   elseif(isset($bad[$url])) continue;
   elseif($url=='') continue;

   $html=curl_fetch($url,$proxy);
   if(curl_error_msg($html)===false) {
        $bad[$url]=$url;
         continue;
   }

    #... что-то делаем с html

   $visited[$url]=1;
}

#----------------------------------
#сложный способ: есть пополняемый файл,куда скидываются урлы для обработки от краулера:

#всякие логи:
$log=fopen("log/worker_{$argv[1]}.log","a+");
$f="log/worker_{$argv[1]}";
if($argv[1]<10) $wid="0{$argv[1]}";
else $wid=(string)$argv[1];

if(file_exists("{$f}.lock")) _e2("WORKER IS ACTIVE!");
$z=fopen("{$f}.lock","w");
fputs($z,"1");
fclose($z);
if(file_exists("{$f}.pos")) $file_pos=(int)file_get_contents("{$f}.pos");
else $file_pos=0;

#есть файл типа urls_1.txt
$data=fopen("urls_{$argv[1]}.txt","r");

#сколько раз чекать файл:
$attempts=10;

while($attempts>0){

    #продолжить с последнего места:
    if($file_pos>0) {
         $n=0;
         _l("FILE_POS={$file_pos}");
         while(!feof($data)) {
             $s=fgets($data);
             $n++;
             if($n==$file_pos) break;
         }
         _l("FILE_POS_SKIPPED={$n}");
     }

     while(!feof($data)){
        $s=trim(fgets($data));
        if($s===false||$s=='') continue;

       $file_pos++;
       if(isset($visited[$s])) continue;
       if(isset($bad[$s])) continue;
       $html=curl_fetch($s,$proxy);

       $html=curl_fetch($url,$proxy);
       if(curl_error_msg($html)===false) {
           $bad[$url]=$url;
           continue;
       }

       #... что-то делаем с html

       $visited[$url]=1;
   }
   fclose($data);
   $attempts--;
   #спим 10 секунд и смотрим снова в файл:
   $data=fopen("urls_{$argv[1]}.txt","r");
}


#---------------

это пример одного рабочего скрипта, который занимается парсингом сайтов в 10 потоков с разных проксей. Пример сильно упрощен на процентов 80%,
но для примера сойдет.


Эта страница в полной версии