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

      編輯Tag賺U幣

      推薦:php獲取本地圖片文件并生成xml文件輸出具體思路
      本文將詳細介紹下php獲取本地圖片文件并生成xml文件輸出,代碼簡單實用,感興趣的朋友可以參考下哈,希望對你學習php有所幫助

      用第一篇的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');代碼如下:

      復制代碼 代碼如下:www.wf0088.com

      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的值。

      復制代碼 代碼如下:www.wf0088.com

      $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文件如下:

      復制代碼 代碼如下:www.wf0088.com

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

      然后調用如下:
      復制代碼 代碼如下:www.wf0088.com

      $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 模擬get_headers函數的代碼示例
      本篇文章介紹了,php模擬get_headers函數的代碼示例。需要的朋友參考下

      來源:模板無憂//所屬分類:PHP教程/更新時間:2013-04-29
      相關PHP教程