天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

基于curl數據采集之單頁面并行采集函數get_htmls的使用

用第一篇的get_html()實現簡單的數據采集,由于是一個一個執行才采集數據的傳輸時間就會是所有頁面下載的總時長,一個頁面假設1秒,那么10個頁面就是10秒了。所幸curl還提供了并行處理的功能。

要寫一個并行采集的函數,先要了解要采集什么樣的頁面,對采集的頁面用什么請求,才能寫出一個相對常用的函數。


功能需求分析:

返回什么?

當然每一個頁面的html集合成的數組

傳遞什么參數?

編寫get_html()時,我們知道了可以用options數組來傳遞更多的curl參數,那么多頁面同時采集函數的編寫這種特性也得保留下來。

什么類型的參數?

無論是請求網頁HTML,還是調用互聯網api接口,get和post傳遞參數總是請求同一個頁面或者接口,只是參數不同罷了。那么參數的類型是:

get_htmls($url,$options);

$url 是string

$options,是一個二維數組,每一個頁面的參數為一個數組。

這樣的話,貌似解決了問題。但是我找遍了curl的手冊都沒有看到get的參數傳遞在什么地方,所以只能$url 是數組的形式傳遞并且增加一個method參數


函數的原型就定下來了get_htmls($urls,$options = array, $method = ‘get');代碼如下:
復制代碼 代碼如下:
function get_htmls($urls, $options = array(), $method = 'get'){
     $mh = curl_multi_init();
     if($method == 'get'){//get方式傳值 最常用
         foreach($urls as $key=>$url){
             $ch = curl_init($url);
             $options[CURLOPT_RETURNTRANSFER] = true;
             $options[CURLOPT_TIMEOUT] = 5;
             curl_setopt_array($ch,$options);
             $curls[$key] = $ch;
             curl_multi_add_handle($mh,$curls[$key]);
         }
     }elseif($method == 'post'){//post方式傳值
         foreach($options as $key=>$option){
             $ch = curl_init($urls);
             $option[CURLOPT_RETURNTRANSFER] = true;
             $option[CURLOPT_TIMEOUT] = 5;
             $option[CURLOPT_POST] = true;
             curl_setopt_array($ch,$option);
             $curls[$key] = $ch;
             curl_multi_add_handle($mh,$curls[$key]);
         }
     }else{
         exit("參數出錯!/n");
     }
     do{
         $mrc = curl_multi_exec($mh,$active);
         curl_multi_select($mh);//減少CPU壓力 注釋掉CPU壓力變大
     }while($active);
     foreach($curls as $key=>$ch){
         $html = curl_multi_getcontent($ch);
         curl_multi_remove_handle($mh,$ch);
         curl_close($ch);
         $htmls[$key] = $html;
     }
     curl_multi_close($mh);
     return $htmls;
 }

常用的get請求是通過改變url參數來實現的,又因為我們的函數是針對數據采集的。必然是分類采集,所以網址類似于這種:

http://www.baidu.com/s?wd=shili&pn=0&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=10&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=20&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=30&ie=utf-8

http://www.baidu.com/s?wd=shili&pn=50&ie=utf-8

上面五個頁面是很有規律的,改變的僅僅是pn的值。
復制代碼 代碼如下:
$urls = array();
 for($i=1; $i<=5; $i++){
     $urls[] = 'http://www.baidu.com/s?wd=shili&pn='.(($i-1)*10).'&ie=utf-8';
 }
 $option[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0';
 $htmls = get_htmls($urls,$option);
 foreach($htmls as $html){
     echo $html;//這里得到html 就可以進行數據處理了
 }

模擬常用的post請求:

寫一個post.php文件如下:
復制代碼 代碼如下:
 if(isset($_POST['username']) && isset($_POST['password'])){
     echo '用戶名是: '.$_POST['username'].' 密碼是: '.$_POST['password'];
 }else{
     echo '請求錯誤!';
 }

然后調用如下:
復制代碼 代碼如下:
$url = 'http://localhost/yourpath/post.php';//這里是你的路徑
 $options = array();
 for($i=1; $i<=5; $i++){
     $option[CURLOPT_POSTFIELDS] = 'username=user'.$i.'&password=pass'.$i;
     $options[] = $option;
 }
 $htmls = get_htmls($url,$options,'post');
 foreach($htmls as $html){
     echo $html;//這里得到html 就可以進行數據處理了
 }

這樣這個get_htmls函數也基本能實現一些數據采集的功能了

今天分享就到這里 寫的不好的 講得不清楚的 請多多指教

php技術基于curl數據采集之單頁面并行采集函數get_htmls的使用,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 手机在线免费 | 亚洲国产免费观看视频 | 国产欧美无码亚洲 | 97人妻精品全国免费视频 | 国产成人久久婷婷精品流白浆 | 秘密教学26我们在做一次吧免费 | 接吻吃胸摸下面啪啪教程 | 国产亚洲精品久久久久久久 | 国精品产露脸偷拍视频 | 毛片亚洲毛片亚洲毛片 | 9久高清在线不卡免费无吗视频 | 久久精品国产视频澳门 | beeg日本高清xxxx | 97色伦在色在线播放 | 青青草AV国产精品 | 成人小视频在线观看免费 | 亚洲片在线观看 | 亚洲人美女肛交真人全程 | 亚洲黄色在线视频 | 国产精品看高国产精品不卡 | 精品久久久久久电影网 | 国产欧美一区二区精品仙草咪 | 国产精品日本欧美一区二区 | 99热久久这里只精品国产WWW | 国产亚洲视频在线 | 国产欧美在线亚洲一区刘亦菲 | 久久久黄色片 | 黄桃AV无码免费一区二区三区 | 99精品国产AV一区二区麻豆 | 两个客户一起吃我的奶 | 国产午夜精品片一区二区三区 | 人妻少妇久久久久久97人妻 | 国语92电影网午夜福利 | 799是什么意思网络用语 | 久久午夜宫电影网 | 韩国精品无码少妇在线观看网站 | 大香伊蕉在人线国产97 | 久草在线福利资站免费视频 | 国拍在线精品视频免费观看 | 新香蕉少妇视频网站 | 嘟嘟嘟WWW免费高清在线中文 |