使用PHP採集遠程圖片

當咱們須要採集網絡上的某個網頁內容時,若是目標網站上的圖片作了防盜鏈的話,咱們直接採集過來的圖片在本身網站上是不可用的。那麼咱們使用程序將目標網站上的圖片下載到咱們網站服務器上,而後就可調用圖片了。
 
本文將使用PHP實現採集遠程圖片功能。基本流程:
 
一、獲取目標網站圖片地址。
 
二、讀取圖片內容。
 
三、建立要保存圖片的路徑並命名圖片名稱。
 
四、寫入圖片內容。
 
五、完成。
 
咱們經過寫幾個函數來實現這一過程。
 
函數make_dir()創建目錄。判斷要保存的圖片文件目錄是否存在,若是不存在則建立目錄,而且將目錄設置爲可寫權限。
 
   
   
   
   
  1. function make_dir($path){  
  2.     if(!file_exists($path)){//不存在則創建  
  3.         $mk=@mkdir($path,0777); //權限  
  4.         @chmod($path,0777);  
  5.     }  
  6.     return true;  
  7. }  
函數read_filetext()取得圖片內容。使用fopen打開圖片文件,而後fread讀取圖片文件內容。
 
   
   
   
   
  1. function read_filetext($filepath){  
  2.     $filepath=trim($filepath);  
  3.     $htmlfp=@fopen($filepath,"r");  
  4.     //遠程  
  5.     if(strstr($filepath,"://")){  
  6.         while($data=@fread($htmlfp,500000)){  
  7.             $string.=$data;  
  8.         }  
  9.     }  
  10.     //本地  
  11.     else{  
  12.         $string=@fread($htmlfp,@filesize($filepath));  
  13.     }  
  14.     @fclose($htmlfp);  
  15.     return $string;  
  16. }  
函數write_filetext()寫文件,將圖片內容fputs寫入文件中,即保存圖片文件。
 
   
   
   
   
  1. function write_filetext($filepath,$string){  
  2.     //$string=stripSlashes($string);  
  3.     $fp=@fopen($filepath,"w");  
  4.     @fputs($fp,$string);  
  5.     @fclose($fp);  
  6. }  
函數get_filename()獲取圖片名稱,也能夠自定義要保存的文件名。
 
   
   
   
   
  1. function get_filename($filepath){  
  2.     $fr=explode("/",$filepath);  
  3.     $count=count($fr)-1;  
  4.     return $fr[$count];  
  5. }  
而後將幾個函數組合,在函數save_pic()中調用,最後返回保存後的圖片路徑。
 
   
   
   
   
  1. function save_pic($url,$savepath=''){  
  2.     //處理地址  
  3.     $url=trim($url);  
  4.     $url=str_replace(" ","%20",$url);  
  5.     //讀文件  
  6.     $string=read_filetext($url);  
  7.     if(emptyempty($string)){  
  8.         echo '讀取不了文件';exit;  
  9.     }  
  10.     //文件名  
  11.     $filename = get_filename($url);  
  12.     //存放目錄  
  13.     make_dir($savepath); //創建存放目錄  
  14.     //文件地址  
  15.     $filepath = $savepath.$filename;  
  16.     //寫文件  
  17.     write_filetext($filepath,$string);  
  18.     return $filepath;  
  19. }  
最後一步就是調用save_pic()函數保存圖片,咱們使用如下代碼作測試。
 
   
   
   
   
  1. //目標圖片地址  
  2. $pic = "http://img0.pconline.com.cn/pconline/1205/06/2776119_end1_thumb.jpg";  
  3. //保存目錄  
  4. $savepath = "p_w_picpaths/";  
  5. echo save_pic($pic,$savepath);  
實際應用中,咱們可能會採集某個站點的內容,好比產品信息,包括採集防盜鏈的圖片保存到網站上服務器上。這時咱們能夠使用正則匹配頁面內容,將頁面中相匹配的圖片都找出來,而後分別下載到網站服務器上,完成圖片的採集。如下代碼僅供測試:
 
   
   
   
   
  1. function get_pic($cont,$path){  
  2.     $pattern_src = '/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/';  
  3.     $num = preg_match_all($pattern_src$cont$match_src);  
  4.     $pic_arr = $match_src[1]; //得到圖片數組  
  5.     foreach ($pic_arr as $pic_item) { //循環取出每幅圖的地址  
  6.         save_pic($pic_item,$path); //下載並保存圖片  
  7.         echo "[OK]..!";  
  8.     }  
  9. }  
而後咱們經過分析頁面內容,將主體內容找出來,調用get_pic()實現圖片的保存。
 
//咱們採集太平洋電腦網上一篇關於手機報道內容頁的圖片 
 
   
   
   
   
  1. $url = "http://gz.pconline.com.cn/321/3215791.html";  
  2.   
  3. $content = file_get_contents($url);//獲取網頁內容  
  4. $preg = '#<div class="art_con">(.*)<div class="ivy620 ivy620Ex"></div>#iUs';  
  5. preg_match_all($preg$content$arr);  
  6. $cont = $arr[1][0];   
  7. get_pic($cont,'img/');  
以上代碼筆者親測,能夠採集圖片,可是還有些場景沒考慮進去,好比目標網站作了302屢次跳轉的,目標網站作了多種防採集的,留給喜歡折騰的同窗去試試吧。
相關文章
相關標籤/搜索