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%,
но для примера сойдет.