PHP批量采集下載美女圖片的實(shí)現(xiàn)代碼_PHP教程

      編輯Tag賺U幣

      推薦:基于PHP CURL獲取郵箱地址的詳解
      本篇文章是對PHP利用CURL獲取郵箱地址進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

      設(shè)計(jì)思路

      考慮到單純的采集一個網(wǎng)頁的圖片,太麻煩,所以直接采集他的列表頁,獲取列表的url然后在一一采集,但是用php匹配列表頁的url太麻煩,第一列表頁有很多無效url這對我這個正則小菜鳥實(shí)在是個問題,看了一下列表頁的結(jié)構(gòu),果斷采用jquery獲取url,jquery的萬能選擇器又再次強(qiáng)大起來了。

      jquery獲取url,然后ajax傳遞url—>對應(yīng)PHP文件,遍歷url參數(shù)—->單頁面采集保存圖片

      jquery程序
      復(fù)制代碼 代碼如下:www.wf0088.com

      <script src="http://www.cztv.com/uibase/jquery.js"></script>
      <script >
      $(document).ready(function(){
      var hrefs ='';
      $('.f_folder>a').each(function(i){
      var href = $('.f_folder:eq('+i+')>a:eq(0)').attr('href');
      if(href!='undefined'){
      hrefs +=href+',';
      }
      })
      $.getJSON("http://www.****.com/365/getimg.php?hrefs="+hrefs+"&callback=?", function(data){
      //alert(data.info);
      });
      });
      </script>


      這里把url拼接成‘,'分割的字符串傳遞url,使用getjson是為了跨域需要,關(guān)于getjson常見的幾個問題可以參看<$.getjson遇到的幾個問題>

      PHP采集程序
      復(fù)制代碼 代碼如下:www.wf0088.com

      <?php
      // 抓起365圖片
      error_reporting(E_ALL ^ E_NOTICE);
      set_time_limit(0);//設(shè)置PHP超時時間
      /**
      * 得到當(dāng)前時間
      */
      function getMicrotime() {

      list ($usec, $sec) = explode(" ", microtime());
      return ((float) $usec + (float) $sec);
      }
      $stime = getMicrotime();

      $callback = $_GET['callback'];
      $hrefs = $_GET['hrefs'];
      $urlarray = explode(',',$hrefs);

      //獲取指定url的所有圖片
      function getimgs($url){
      $dirname = basename($url,".php");
      if(!file_exists($dirname)){
      mkdir('365/'.$dirname.'');
      }
      clearstatcache();
      $data = file_get_contents($url);
      //$matches[3] = array_unique($matches[3]);
      unset($data);
      $i=0;

      if(count($matches[3])>0){
      foreach($matches[3] as $k=>$v){
      //簡單判斷是否是標(biāo)準(zhǔn)url,而不是相對路徑
      if(substr($v,0,4)=='http'){

      $ext = pathinfo($v,PATHINFO_EXTENSION);//圖片擴(kuò)展

      if(!file_exists('365/'.$dirname.'/'.$k.'.'.$ext)){
      file_put_contents('365/'.$dirname.'/'.$k.'.'.$ext,file_get_contents($v));
      $i++;
      }else{
      unset($v);
      }
      clearstatcache();
      }else{
      unset($v);
      }
      }
      unset($matches);
      return $i;
      }
      }

      foreach($urlarray as $k=>$v){
      if($v!=''){
      $j +=getimgs($v);
      }
      }
      $etime = getMicrotime();
      echo "合計(jì)采集了".$j."張圖片";
      echo "用時".($etime-$stime)."秒";


      考慮到性能問題:在getimgs方法中所用的變量都是使用后便注銷(unset)了,以便釋放內(nèi)存。

      設(shè)計(jì)到的幾個知識點(diǎn)

      判斷是否是標(biāo)準(zhǔn)有效圖片url
      if(substr($v,0,4)=='http')這個只是簡單的判斷一下匹配到的圖片url是否是標(biāo)準(zhǔn)的url,因?yàn)椴杉膱D片可能是相對路徑的,這里我直接放棄這種圖片的采集,當(dāng)然你也可以把這種圖片還原成標(biāo)準(zhǔn)圖片路徑,還有一個問題就是即使是標(biāo)準(zhǔn)url格式,這樣的圖片也未必可以采集,因?yàn)槟悴恢肋@個圖片是否還有,也許這個圖片url已經(jīng)無效了,如果你想更嚴(yán)格的判斷這個圖片url是否真實(shí)有效可以推薦看我之前的《》有三種方法可以驗(yàn)證是否是有效url。

      獲取圖片格式

      $ext = pathinfo($v,PATHINFO_EXTENSION);//圖片擴(kuò)展

      這里使用了pathinfo的方法,總結(jié)有7種方法可以獲取到文件的格式,推薦文章:《》

      下載保存到本地

      file_put_contents('365/'.$dirname.'/'.$k.'.'.$ext,file_get_contents($v));
      file_put_contents() 函數(shù)把一個字符串寫入文件中。
      與依次調(diào)用 fopen(),fwrite() 以及 fclose() 功能一樣。
      file_get_contents() 函數(shù)把整個文件讀入一個字符串中。

      因?yàn)榉⻊?wù)器支持file_get_contents,如果服務(wù)器把這個函數(shù)禁用了,可以使用curl,這個工具要比file_get_contents更加強(qiáng)大,推薦學(xué)習(xí)《》,可以使用curl的多線程下載存儲,效果更牛逼

      清除文件操作緩存

      clearstatcache() 函數(shù)清除文件狀態(tài)緩存。clearstatcache() 函數(shù)會緩存某些函數(shù)的返回信息,以便提供更高的性能。但是有時候,比如在一個腳本中多次檢查同一個文件,而該文件在此腳本執(zhí)行期間有被刪除或修改的危險時,你需要清除文件狀態(tài)緩存,以便獲得正確的結(jié)果。要做到這一點(diǎn),就需要使用 clearstatcache() 函數(shù)。官方手冊:

      程序執(zhí)行時間計(jì)算

      復(fù)制代碼 代碼如下:www.wf0088.com

      /**

      * 得到當(dāng)前時間

      */

      function getMicrotime() {
      list ($usec, $sec) = explode(" ", microtime());
      return ((float) $usec + (float) $sec);
      }


      可以參考本博客文章;《》

      最后看一下效果;



      409秒采集了214張圖片,大概2秒下載保存了一張圖片,圖片總大小約62M,這樣看來:

      一個小時60*60可以大約下載1800張美女圖片。

      分享:解析CI即CodeIgniter框架在Nginx下的重寫規(guī)則
      本篇文章是對CI即CodeIgniter框架在Nginx下的重寫規(guī)則進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

      來源:模板無憂//所屬分類:PHP教程/更新時間:2013-06-04
      相關(guān)PHP教程