国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > 建站經(jīng)驗(yàn) > 正文

php結(jié)合curl實(shí)現(xiàn)多線程抓取

2024-04-25 20:38:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

php結(jié)合curl實(shí)現(xiàn)多線程抓取

<?php

/*

curl 多線程抓取

*/

/**

* curl 多線程


*

* @param array $array 并行網(wǎng)址

* @param int $timeout 超時(shí)時(shí)間

* @return array

*/

function Curl_http($array,$timeout){

$res = array();

$mh = curl_multi_init();//創(chuàng)建多個(gè)curl語(yǔ)柄

$startime = getmicrotime();

foreach($array as $k=>$url){

$conn[$k]=curl_init($url);

curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//設(shè)置超時(shí)時(shí)間

curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');

curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向級(jí)別

curl_setopt($conn[$k], CURLOPT_HEADER, 0);//這里不要header,加塊效率

curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect

curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);

curl_multi_add_handle ($mh,$conn[$k]);

}

//防止死循環(huán)耗死cpu 這段是根據(jù)網(wǎng)上的寫(xiě)法

do {

$mrc = curl_multi_exec($mh,$active);//當(dāng)無(wú)數(shù)據(jù),active=true

} while ($mrc == CURLM_CALL_MULTI_PERFORM);//當(dāng)正在接受數(shù)據(jù)時(shí)

while ($active and $mrc == CURLM_OK) {//當(dāng)無(wú)數(shù)據(jù)時(shí)或請(qǐng)求暫停時(shí),active=true

if (curl_multi_select($mh) != -1) {

do {

$mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

}

foreach ($array as $k => $url) {

curl_error($conn[$k]);

$res[$k]=curl_multi_getcontent($conn[$k]);//獲得返回信息

$header[$k]=curl_getinfo($conn[$k]);//返回頭信息

curl_close($conn[$k]);//關(guān)閉語(yǔ)柄

curl_multi_remove_handle($mh , $conn[$k]); //釋放資源

}

curl_multi_close($mh);

$endtime = getmicrotime();

$diff_time = $endtime - $startime;

return array('diff_time'=>$diff_time,

'return'=>$res,

'header'=>$header

);

}

//計(jì)算當(dāng)前時(shí)間

function getmicrotime() {

list($usec, $sec) = explode(" ",microtime());

return ((float)$usec + (float)$sec);

}

//測(cè)試一下,curl 三個(gè)網(wǎng)址

$array = array(

"http://www.weibo.com/",

"http://www.renren.com/",

"http://www.qq.com/"

);

$data = Curl_http($array,'10');//調(diào)用

var_dump($data);//輸出

//如果POST的數(shù)據(jù)大于1024字節(jié),curl并不會(huì)直接就發(fā)起POST請(qǐng)求

//發(fā)送請(qǐng)求時(shí),header中包含一個(gè)空的Expect。curl_setopt($ch, CURLOPT_HTTPHEADER, array("Expect:"));

?>

我們?cè)賮?lái)看幾個(gè)例子

(1)下面這段代碼是實(shí)現(xiàn)抓取多個(gè)URL,然后將抓取的URL的頁(yè)面代碼寫(xiě)入指定的文件

$urls = array(

'http://www.jb51.net/',

'http://www.google.com/',

'http://www.example.com/'

); // 設(shè)置要抓取的頁(yè)面URL

$save_to='/test.txt'; // 把抓取的代碼寫(xiě)入該文件

$st = fopen($save_to,"a");

$mh = curl_multi_init();

foreach ($urls as $i => $url) {

$conn[$i] = curl_init($url);

curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");

curl_setopt($conn[$i], CURLOPT_HEADER ,0);

curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);

curl_setopt($conn[$i], CURLOPT_FILE,$st); // 將爬取的代碼寫(xiě)入文件

curl_multi_add_handle ($mh,$conn[$i]);

} // 初始化

do {

curl_multi_exec($mh,$active);

} while ($active); // 執(zhí)行

foreach ($urls as $i => $url) {

curl_multi_remove_handle($mh,$conn[$i]);

curl_close($conn[$i]);

} // 結(jié)束清理

curl_multi_close($mh);

fclose($st);

(2)下面這段代碼和上面差不多意思,只不過(guò)這個(gè)地方是將獲得的代碼先放入變量,然后再將獲取到的內(nèi)容寫(xiě)入指定的文件

$urls = array(

'http://www.jb51.net/',

'http://www.google.com/',

'http://www.example.com/'

);

$save_to='/test.txt'; // 把抓取的代碼寫(xiě)入該文件

$st = fopen($save_to,"a");

$mh = curl_multi_init();

foreach ($urls as $i => $url) {

$conn[$i] = curl_init($url);

curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");

curl_setopt($conn[$i], CURLOPT_HEADER ,0);

curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);

curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不將爬取代碼寫(xiě)到瀏覽器,而是轉(zhuǎn)化為字符串

curl_multi_add_handle ($mh,$conn[$i]);

}

do {

curl_multi_exec($mh,$active);

} while ($active);

foreach ($urls as $i => $url) {

$data = curl_multi_getcontent($conn[$i]); // 獲得爬取的代碼字符串

fwrite($st,$data); // 將字符串寫(xiě)入文件

} // 獲得數(shù)據(jù)變量,并寫(xiě)入文件

foreach ($urls as $i => $url) {

curl_multi_remove_handle($mh,$conn[$i]);

curl_close($conn[$i]);

}

curl_multi_close($mh);

fclose($st);

(3)下面這段代碼實(shí)現(xiàn)的是利用 PHP 的 Curl Functions 實(shí)現(xiàn)并發(fā)多線程下載文件

$urls=array(

'http://www.jb51.net/5w.zip',

'http://www.jb51.net/5w.zip',

'http://www.jb51.net/5w.zip'

);

$save_to='./home/';

$mh=curl_multi_init();

foreach($urls as $i=>$url){

$g=$save_to.basename($url);

if(!is_file($g)){

$conn[$i]=curl_init($url);

$fp[$i]=fopen($g,"w");

curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");

curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);

curl_setopt($conn[$i],CURLOPT_HEADER ,0);

curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);

curl_multi_add_handle($mh,$conn[$i]);

}

}

do{

$n=curl_multi_exec($mh,$active);

}while($active);

foreach($urls as $i=>$url){

curl_multi_remove_handle($mh,$conn[$i]);

curl_close($conn[$i]);

fclose($fp[$i]);

}

curl_multi_close($mh);$urls=array(

'http://www.jb51.net/5w.zip',

'http://www.jb51.net/5w.zip',

'http://www.jb51.net/5w.zip'

);

$save_to='./home/';

$mh=curl_multi_init();

foreach($urls as $i=>$url){

$g=$save_to.basename($url);

if(!is_file($g)){

$conn[$i]=curl_init($url);

$fp[$i]=fopen($g,"w");

curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");

curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);

curl_setopt($conn[$i],CURLOPT_HEADER ,0);

curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);

curl_multi_add_handle($mh,$conn[$i]);

}

}

do{

$n=curl_multi_exec($mh,$active);

}while($active);

foreach($urls as $i=>$url){

curl_multi_remove_handle($mh,$conn[$i]);

curl_close($conn[$i]);

fclose($fp[$i]);

}

curl_multi_close($mh);

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 玛纳斯县| 富裕县| 抚宁县| 华安县| SHOW| 苏尼特左旗| 河东区| 方山县| 郁南县| 祁连县| 闽侯县| 高阳县| 广西| 赣榆县| 汕头市| 洛隆县| 阜城县| 栾城县| 大厂| 浦县| 湖州市| 衡山县| 新和县| 甘德县| 福泉市| 永安市| 定安县| 兴安盟| 普陀区| 潞城市| 长阳| 临汾市| 墨江| 周口市| 朝阳市| 庆城县| 辰溪县| 罗源县| 留坝县| 陆河县| 托克托县|