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

首頁(yè) > 開發(fā) > PHP > 正文

PHP+Ajax遠(yuǎn)程圖片抓取器下載的例子

2024-05-04 21:49:35
字體:
供稿:網(wǎng)友

發(fā)送請(qǐng)求:將輸入的目標(biāo)網(wǎng)址及保存路徑名稱采用AJAX異步的方式發(fā)送到image.info.php文件,該文件中包含有一個(gè)ImageCatch類,注意,因?yàn)橛幸粋€(gè)是指定目標(biāo)圖片抓取,一個(gè)是只要指定一個(gè)網(wǎng)址,如http://m.survivalescaperooms.com形式,所以還要有一個(gè)參數(shù)用來判斷是指定目標(biāo)抓取還是指定網(wǎng)站抓取.

接收請(qǐng)求:接收發(fā)送過來的兩個(gè)參數(shù),目標(biāo)網(wǎng)址及保存路徑,實(shí)例化ImageCatch類,將地址及保存路徑傳進(jìn)去,用file_get_contents函數(shù)將目標(biāo)地址的內(nèi)容讀取賦值給一個(gè)變量$content.

先說指定圖片抓取的實(shí)現(xiàn):指定圖片抓取的方法實(shí)現(xiàn)比較簡(jiǎn)單,直接用file_get_contents函數(shù)將圖片讀取到,再用file_put_contents寫入到一個(gè)文件保存起來就可以了.

指定網(wǎng)址抓取圖片的實(shí)現(xiàn):

方法跟指定圖片地址抓取就有點(diǎn)不一樣了,因?yàn)椴捎玫氖莏query+ajax無刷新模式抓取,所以,請(qǐng)求要一次一次發(fā),先說第一次發(fā)什么請(qǐng)求,很顯然,第一次發(fā)的請(qǐng)求內(nèi)容是獲取目標(biāo)網(wǎng)址的所有圖片地址及圖片總數(shù),那要怎樣獲取目標(biāo)網(wǎng)址的所有圖片地址呢?思路跟上面的一樣,但方法不同.

第一步:用file_get_contents函數(shù)讀取目標(biāo)網(wǎng)址賦值給一個(gè)content變量.

第二步:用正則匹配所有img標(biāo)簽里的src屬性,并保存在一個(gè)數(shù)組,這樣網(wǎng)頁(yè)的圖片地址就已經(jīng)拿到了.

第三步:用正則匹配所有樣式表文件link標(biāo)簽的href屬性,并保存在一個(gè)數(shù)組$arr1.

第四步:還是用file_get_contents函數(shù)讀取獲取的樣式表文件,再用正則去匹配到css樣式里的url背景圖片地址,并保存在一個(gè)數(shù)組$arr2,這樣css樣式的圖片又拿到了.

第五步:將$arr1和$arr2用array_merge函數(shù)進(jìn)行合并成$arr,再用一個(gè)數(shù)組$arr3(‘total’=>count($arr))得出圖片總數(shù)并追加到數(shù)組$arr里面去,這樣圖片地址和總數(shù)都拿到了.

第六步:用json_encode編譯一個(gè)返回json數(shù)據(jù)

第七步:接收返回回來的json數(shù)據(jù),將數(shù)據(jù)都存入一個(gè)數(shù)組,判斷是否數(shù)組為空,不為空,則用函數(shù)遞歸的方法調(diào)用一個(gè)函數(shù),每調(diào)用一次,在返回結(jié)果后就將該數(shù)組的第一個(gè)元素去掉,再判斷數(shù)組是否為空,不為空,則繼續(xù)發(fā)送抓取請(qǐng)求,直到數(shù)組為空,全部圖片就已經(jīng)都抓取完畢.

好了現(xiàn)在看例子,index.php代碼如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  5. <title>PHP遠(yuǎn)程圖片抓取</title> 
  6. <style> 
  7. body { margin:0; padding:0; } 
  8. #content { width:90%; height:auto; margin:0 auto; margin-top:20px; font-size:12px; color:#333; } 
  9. #content .h1 { width:100%; line-height:30px; text-align:left; } 
  10. #content .h2 { width:100%; line-height:30px; text-align:left; } 
  11. #content .Schedule { width:auto; height:12px; margin:15px 0px; display:none; background:url() } 
  12. #content ul { width:100%; height:auto; margin-top:10px; } 
  13. #content ul li { height:24px; line-height:24px;} 
  14. #content font { color:#f00; } 
  15. </style> 
  16. <script type="text/javascript" src="js/jquery.js"></script> 
  17. <script> 
  18. $(document).ready(function() { 
  19.     var TargetUrl; 
  20.  var Save; 
  21.  function error(info) { 
  22.   $('#content .h2 font').text(info); 
  23.  } 
  24.  function statusInfo(info) { 
  25.   $('#content ul').append('<li>'+info+'</li>'); 
  26.  } 
  27.  //禁用按鈕 
  28.  function start_d() { 
  29.   $('#Single,#more').attr('disabled','disabled'); 
  30.  } 
  31.  //解放按鈕 
  32.  function start_s() { 
  33.   $('#Single,#more').removeProp('disabled'); 
  34.  } 
  35.  //進(jìn)度跳轉(zhuǎn) 
  36.  function href() { 
  37.   location.href='#bottom'
  38.  } 
  39.  //單個(gè)圖片抓取 
  40.  $('#content .h1 #Single').click(function() { 
  41.   TargetUrl=$('#content .h2 .TargetUrl').val(); 
  42.   Save=$('#content .h2 .Save').val(); 
  43.   if (TargetUrl=='') { 
  44.    error(' * 請(qǐng)?zhí)顚懩繕?biāo)網(wǎng)址'); 
  45.    return
  46.   } 
  47.   if (Save=='') { 
  48.    error(' * 請(qǐng)?zhí)顚懕4婺夸?#39;); 
  49.    return
  50.   } 
  51.   var zurl=new Array(TargetUrl); 
  52.   start_d(); 
  53.   Crawl(zurl,Save); 
  54.  }); 
  55.  function Crawl(zurl,Save) { 
  56.   start_d(); 
  57.   $('#content .Schedule').show(); 
  58.   if (zurl.length>0) { 
  59.    var curl=zurl[0]; 
  60.   $.ajax({ 
  61.    url:'image.info.php?Single=Single'
  62.    dataType:'json'
  63.    type:'POST'
  64.    data:'TargetUrl='+curl+'&Save='+Save, 
  65.    success: function(data) { 
  66.     if (data.status=='ok') { 
  67.      statusInfo('遠(yuǎn)程圖片 <font>'+curl+'</font> 抓取成功 已保存在 <font>'+data.FileSave+'</font> 文件大?。?lt;font>'+data.FileSize+'</font>'); 
  68.      zurl.shift();  //刪除第一個(gè)數(shù)組元素并返回 
  69.      Crawl(zurl,Save); //使用函數(shù)遞歸 
  70.      href(); 
  71.     }else { 
  72.      zurl.shift();    //刪除第一個(gè)數(shù)組元素并返回 
  73.      Crawl(zurl,Save); //使用函數(shù)遞歸 
  74.      statusInfo(data.status);  //顯示失敗信息 
  75.      $('#content .Schedule').hide(); //隱藏LOADING圖片 
  76.      start_s();   //按鈕啟用 
  77.      href(); 
  78.     } 
  79.    } 
  80.   }); 
  81.   }else { 
  82.    $('#content .Schedule').hide(); 
  83.    statusInfo('圖片抓取完畢'); 
  84.    start_s(); 
  85.    href(); 
  86.   } 
  87.  } 
  88.  //多個(gè)圖片抓取 
  89.  $('#content .h1 #more').click(function() { 
  90.   TargetUrl=$('#content .h2 .TargetUrl').val(); 
  91.   Save=$('#content .h2 .Save').val(); 
  92.   if (TargetUrl=='') { 
  93.    error(' * 請(qǐng)?zhí)顚懩繕?biāo)網(wǎng)址'); 
  94.    return
  95.   } 
  96.   var str=/^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$/; 
  97.   if (!str.test(TargetUrl)) { 
  98.    error(' * 目標(biāo)網(wǎng)址不正確'); 
  99.    return
  100.   } 
  101.   if (Save=='') { 
  102.    error(' * 請(qǐng)?zhí)顚懕4婺夸?#39;); 
  103.    return
  104.   } 
  105.   start_d(); 
  106.   $('#content .Schedule').show(); 
  107.   $.ajax({ 
  108.    url:'image.info.php?more=more'
  109.    dataType:'json'
  110.    type:'POST'
  111.    data:'TargetUrl='+TargetUrl+'&Save='+Save, 
  112.    success: function(data) { 
  113.     if (data[0]!='no') { 
  114.      statusInfo('在目標(biāo)網(wǎng)址 <font>'+TargetUrl+'</font> 找到 <font>'+data['total']+'</font> 張圖片,現(xiàn)正在進(jìn)行抓取....'); 
  115.      var zurl=new Array(); 
  116.      for (i=0; i<data['total']; i++) { 
  117.       zurl.push(data[i]); 
  118.      } 
  119.      Crawl(zurl,Save); 
  120.     }else { 
  121.      statusInfo("未抓取找到任何圖片"); 
  122.      $('#content .Schedule').hide(); 
  123.      start_s(); 
  124.     } 
  125.    } 
  126.   }); 
  127.  }); 
  128.  $('#clear').click(function() { 
  129.   $('#content ul li').remove(); 
  130.  }); 
  131. }); 
  132. </script> 
  133. </head> 
  134. <body> 
  135. <div id="content"
  136.  <h1>PHP遠(yuǎn)程圖片抓取程序</h1> 
  137.  <div class="h1"
  138.     指定圖片抓取:<input type="button" value=" 開始抓取 " id="Single" /> <font>目標(biāo)網(wǎng)址如:http://m.survivalescaperooms.com/123.jpg</font>  指定網(wǎng)址抓取:<input type="button" value=" 開始抓取 " id="more" /> <font>目標(biāo)網(wǎng)址如:http://m.survivalescaperooms.com</font>  <input type="button" value=" 清空狀態(tài)信息 " id="clear" /> 
  139.     </div> 
  140.     <div class="Schedule"><font>正在抓取,請(qǐng)稍后...</font> <img src="loading.gif" border="0" /></div> 
  141.     <div class="h2">目標(biāo)網(wǎng)址:<input type="text" class="TargetUrl" size="40" /> 保存地址:<input type="text" class="Save" /><font></font></div> 
  142.     <ul> 
  143.     </ul> 
  144.     <a name="bottom"></a> 
  145. </div> 
  146. </body> 
  147. </html>  

images.info.php,代碼如下:

  1. <?php 
  2. header('Content-Type; text/json; charset=utf-8'); 
  3. $Single=$_GET['Single']; 
  4. $more=$_GET['more']; 
  5. $TargetUrl=$_POST['TargetUrl']; 
  6. $Save=$_POST['Save']; 
  7. //判斷是抓取單個(gè)圖片還是多個(gè)圖片 
  8. if ($Single=='Single') { 
  9.  $ImageCatch=new ImageCatch($TargetUrl,$Save); 
  10.  $ImageCatch->S(); 
  11. }else if ($more=='more') { 
  12.  $ImageCatch=new ImageCatch($TargetUrl,$Save); 
  13.  $ImageCatch->M(); 
  14. //圖片抓取類 
  15. class ImageCatch { 
  16.  private $TargetUrl;  //目標(biāo)地址 
  17.  private $Save;  //保存地址 
  18.  private $FileName//文件名稱及路徑 
  19.  private $Type;  //文件類型 
  20.  private $Size;  //文件大小 
  21.  //構(gòu)造函數(shù) 
  22.  public function __construct($TargetUrl,$Save) { 
  23.   $this->TargetUrl=str_replace("'",'',$TargetUrl);   //去掉單引號(hào) 
  24.   $this->Save=$Save
  25.  } 
  26.  //CSS樣式表中圖片抓取方法 
  27.  public function CSS() { 
  28.   $content=@file_get_contents($this->TargetUrl); 
  29.   //CSS圖片過濾 
  30.   preg_match_all('/<link.+href="?(.*?.css)"?.+>/i',$content,$css); 
  31.   $css[1]=array_unique($css[1]);//移除重復(fù)的值 
  32.   $match2=array(); 
  33.   if (count($css[1])>0) { 
  34.    foreach($css[1] as $val) { 
  35.     if (!preg_match('/^(https?://)/i',$val)) { 
  36.      $val=$this->TargetUrl.'/'.$val
  37.      $csscontent=@file_get_contents($val); 
  38.     }else { 
  39.      $csscontent=@file_get_contents($val); 
  40.     } 
  41.     //匹配圖片URL地址 
  42.     preg_match_all('/url((.*))/i',$csscontent,$cssimg); 
  43.     $cssimg[1]=array_unique($cssimg[1]);//移除重復(fù)的值 
  44.    }    
  45.    foreach($cssimg[1] as $val) { 
  46.     //去除 " ) 字符 
  47.     $val=preg_replace(array('/"|)/'),'',$val); 
  48.     //去除../字符 
  49.     $val=str_replace('../','',$val); 
  50.     //檢查是否是http://開頭,如果不是則加上要抓取的網(wǎng)址 
  51.     if (!preg_match('/^(https?://)/i',$val)) { 
  52.      array_push($match2,$this->TargetUrl.'/'.$val); 
  53.     }else { 
  54.      array_push($match2,$val); 
  55.     } 
  56.    } 
  57.    return $match2
  58.   } 
  59.  } 
  60.  //計(jì)算并返回圖片數(shù)量及地址 
  61.  public function M() { 
  62.   $content=@file_get_contents($this->TargetUrl); 
  63.   //網(wǎng)頁(yè)圖片過濾 
  64.   $str='/<img.+src="?(.+.(jpg|gif|bmp|bnp|png))"?.+>/i'
  65.   preg_match_all($str,$content,$res); 
  66.   if ($res[1]) { 
  67.    $res[1]=array_unique($res[1]);//移除重復(fù)的值 
  68.    $httpstr='/^(https?://)/i'
  69.    $match=array(); 
  70.    foreach($res[1] as $val) { 
  71.     if (!preg_match($httpstr,$val)) { 
  72.      array_push($match,$this->TargetUrl.'/'.$val); 
  73.     }else { 
  74.      array_push($match,$val); 
  75.     } 
  76.    } 
  77.    $cssimg=$this->CSS(); 
  78.    //掃描出css文件圖片的總數(shù)與網(wǎng)頁(yè)圖片相加得到總數(shù) 
  79.    $total=array("total"=>count($match)+count($cssimg)); 
  80.    $result=array_merge($total,$match,$cssimg); 
  81.    //返回JSON數(shù)據(jù) 
  82.    echo json_encode($result); 
  83.   }else { 
  84.    $res=array('no'); 
  85.    echo json_encode($res); 
  86.   } 
  87.   exit
  88.  } 
  89.  //抓取并保存圖片 
  90.  public function S() { 
  91.   $this->Type=substr(strrchr($this->TargetUrl,'.'),1); 
  92.   $this->FileName=$this->Save.'/'.substr(strrchr($this->TargetUrl,'/'),1); 
  93.   $this->imageType(); 
  94.   $content=@file_get_contents($this->TargetUrl); 
  95.   $this->imageDir(); 
  96.   if (!@file_put_contents($this->FileName,$content,FILE_USE_INCLUDE_PATH)) { 
  97.    @unlink($this->FileName); 
  98.    exit('{"status":"沒有找到 '.$this->TargetUrl.' 圖片"}'); 
  99.   }else { 
  100.    $this->imageSize(); 
  101.    exit('{"status":"ok","FileSave":"'.$this->FileName.'","FileSize":"'.$this->Size.'"}'); 
  102.   } 
  103.  } 
  104.  //新建目錄 
  105.  private function imageDir() { 
  106.   if (!@file_exists($this->Save)) { 
  107.    if (!@mkdir($this->Save,0700)) { 
  108.     exit('{"status":"新建保存目錄失敗"}'); 
  109.    } 
  110.   } 
  111.  } 
  112.  //文件類型判斷 
  113.  private function imageType() { 
  114.   $typeArr=array('jpg','png','gif','zip','rar'); 
  115.   if (!in_array($this->Type,$typeArr)) { 
  116.    exit('{"status":"要執(zhí)行抓取的文件擴(kuò)展名有錯(cuò)誤,'.$this->TargetUrl.'"}'); 
  117.   } 
  118.  } 
  119.  //文件大小檢測(cè) 
  120.  private function imageSize() { 
  121.   if (file_exists($this->FileName)) { 
  122.    $this->Size=filesize($this->FileName); 
  123.    if ($this->Size>1024*1024*1024) { 
  124.     $this->Size=round($this->Size/1024/1024/1024,2).' GB'
  125.    }else if ($this->Size>1024*1024) { 
  126.     $this->Size=round($this->Size/1024/1024,2).' MB'
  127.    }else if ($this->Size>1024) { 
  128.     $this->Size=$this->Size/1024; 
  129.     $this->Size=ceil($this->Size).'KB'
  130.    }else { 
  131.     $this->Size=$this->Size.'bit'
  132.    } 
  133.   }else { 
  134.    return '未找到文件'
  135.   } 
  136.  } 
  137. ?>

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 韶关市| 乌兰县| 阿鲁科尔沁旗| 武安市| 霞浦县| 白玉县| 宜章县| 铁岭县| 清徐县| 罗平县| 东乡族自治县| 平定县| 东乌| 巨野县| 恩平市| 渑池县| 老河口市| 遵化市| 金阳县| 潼南县| 肇源县| 定州市| 札达县| 长沙县| 隆德县| 虹口区| 镇坪县| 芮城县| 松江区| 朝阳县| 中西区| 夏河县| 聂荣县| 余江县| 邹平县| 无为县| 丽江市| 昂仁县| 额尔古纳市| 大宁县| 东乡|