最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于curl數(shù)據(jù)采集之單頁面并行采集函數(shù)get_htmls的使用

 更新時間:2013年04月28日 17:15:09   作者:  
用第一篇的get_html()實現(xiàn)簡單的數(shù)據(jù)采集,由于是一個一個執(zhí)行才采集數(shù)據(jù)的傳輸時間就會是所有頁面下載的總時長,一個頁面假設(shè)1秒,那么10個頁面就是10秒了。所幸curl還提供了并行處理的功能

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

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


功能需求分析:

返回什么?

當然每一個頁面的html集合成的數(shù)組

傳遞什么參數(shù)?

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

什么類型的參數(shù)?

無論是請求網(wǎng)頁HTML,還是調(diào)用互聯(lián)網(wǎng)api接口,get和post傳遞參數(shù)總是請求同一個頁面或者接口,只是參數(shù)不同罷了。那么參數(shù)的類型是:

get_htmls($url,$options);

$url 是string

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

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


函數(shù)的原型就定下來了get_htmls($urls,$options = array, $method = ‘get');代碼如下:

復(fù)制代碼 代碼如下:

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("參數(shù)出錯!\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參數(shù)來實現(xiàn)的,又因為我們的函數(shù)是針對數(shù)據(jù)采集的。必然是分類采集,所以網(wǎng)址類似于這種:

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

上面五個頁面是很有規(guī)律的,改變的僅僅是pn的值。

復(fù)制代碼 代碼如下:

$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 就可以進行數(shù)據(jù)處理了
 }

模擬常用的post請求:

寫一個post.php文件如下:

復(fù)制代碼 代碼如下:

 if(isset($_POST['username']) && isset($_POST['password'])){
     echo '用戶名是: '.$_POST['username'].' 密碼是: '.$_POST['password'];
 }else{
     echo '請求錯誤!';
 }

然后調(diào)用如下:
復(fù)制代碼 代碼如下:

$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 就可以進行數(shù)據(jù)處理了
 }

這樣這個get_htmls函數(shù)也基本能實現(xiàn)一些數(shù)據(jù)采集的功能了

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

相關(guān)文章

  • PHP 實現(xiàn)文件壓縮解壓操作的方法

    PHP 實現(xiàn)文件壓縮解壓操作的方法

    這篇文章主要介紹了PHP 實現(xiàn)壓縮解壓操作的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • PHP多進程通信-消息隊列使用

    PHP多進程通信-消息隊列使用

    這篇文章主要介紹了PHP通信-消息隊列使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 微信公眾平臺開發(fā)(五) 天氣預(yù)報功能開發(fā)

    微信公眾平臺開發(fā)(五) 天氣預(yù)報功能開發(fā)

    這篇文章主要介紹了微信公眾平臺開發(fā)(五) 天氣預(yù)報功能開發(fā) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 如何重寫Laravel異常處理類詳解

    如何重寫Laravel異常處理類詳解

    這篇文章主要給大家介紹了關(guān)于如何重寫Laravel異常處理類的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 分享5個非常有用的Laravel Blade指令

    分享5個非常有用的Laravel Blade指令

    這篇文章主要給大家分享介紹了5個非常有用的Laravel Blade指令,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • 詳解PHP對象的串行化與反串行化

    詳解PHP對象的串行化與反串行化

    我們大家有知道PHP串行化可以把變量包括對象,轉(zhuǎn)化成連續(xù)bytes數(shù)據(jù),你可以將串行化后的變量存在一個文件里或在網(wǎng)絡(luò)上傳輸,然后再反串行化還原為原來的數(shù)據(jù)。文章給大家介紹PHP對象的串行化與反串行化,感興趣的朋友一起學習吧
    2016-01-01
  • php-fpm服務(wù)啟動腳本的方法

    php-fpm服務(wù)啟動腳本的方法

    這篇文章主要介紹了php-fpm服務(wù)啟動腳本的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • 用Php編寫注冊后Email激活驗證的實例代碼

    用Php編寫注冊后Email激活驗證的實例代碼

    通過使用Email驗證激活的方法,可以有效的幫你阻止惡意的Spam和注冊機器人的訪問。 用php編寫注冊后Email驗證激活的步驟非常簡單,相信幾分鐘之內(nèi)你就能學會。
    2013-03-03
  • PHP的curl函數(shù)的用法總結(jié)

    PHP的curl函數(shù)的用法總結(jié)

    在本篇文章中小編給大家分享了關(guān)于PHP的curl函數(shù)的用法總結(jié)以及相關(guān)知識點內(nèi)容,需要的讀者們學習下。
    2019-02-02
  • PHP上傳圖片到數(shù)據(jù)庫并顯示的實例代碼

    PHP上傳圖片到數(shù)據(jù)庫并顯示的實例代碼

    這篇文章主要介紹了PHP上傳圖片到數(shù)據(jù)庫并顯示的實例代碼,有興趣的朋友們參考下。
    2019-12-12

最新評論

汽车| 涟水县| 大邑县| 石狮市| 亳州市| 阿合奇县| 专栏| 汝阳县| 孝感市| 商洛市| 微博| 思南县| 临泉县| 台中市| 乌审旗| 屏山县| 兖州市| 华池县| 景宁| 花莲县| 商城县| 金昌市| 泰和县| 海原县| 孟州市| 大余县| 平塘县| 辽阳县| 罗江县| 无棣县| 德安县| 宜州市| 洛南县| 东乌珠穆沁旗| 高阳县| 德江县| 厦门市| 吴堡县| 高淳县| 阆中市| 合江县|