獲取網頁中的圖片地址并保存下載我們需要采集頁面,然后再利用正則表達式獲取頁面中的圖片url,然后我們再通過相關的php函數把圖片保存到指定本地硬盤了.
1.獲取地址
這個功能最主要的就是用正則表達式來匹配頁面源碼里的圖片地址了,這里用到得正則表達式是:
/<img.*src="(.*)"/s*.*>/iU
首先通過PHP自帶的讀取文件函數來獲得請求頁面的html代碼,然后用正則表達式來匹配里面的src地址,這里有兩個注意點:
file_get_content
只能獲取到靜態的頁面內容,也就是說如果你在頁面里看到的是圖片是通過Javascript來展示的,通過這個工具是獲取不到圖片信息的.
有的網站對file_get_content 這個函數做了些限制,如果不是通過瀏覽器打開的網頁,服務器是拒絕請求的,這個時候我們就需要給php 程序添加一個配置信息,讓采集的程序能夠模擬一個留言器的UA(user agent),具體的做法可以通過下面的代碼來實現://現在模擬的是一個Window 環境下的瀏覽器
ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 4399Box.560; .NET4.0C; .NET4.0E)');
通過以上兩點的處理,獲取網頁源碼就沒有問題了,唯一要做的就是用正則表達式對圖片地址的匹配.
例子1,代碼如下:
- /**
- * 獲取替換文章中的圖片路徑
- * @param string $xstr 內容 采集網頁的content
- * @param string $keyword 創建照片的文件名 我寫upimg
- * @param string $oriweb 網址 一般寫null
- * @return string
- *
- */
- function replaceimg($xstr,$keyword, $oriweb){
- $basedir = dirname(__FILE__);
- //保存路徑
- $d = date('Ym', time());
- $dirslsitss = $basedir.'/../uploads/'.$keyword.'/'.$d;//分類是否存在
- if(!is_dir($dirslsitss)) {
- @mkdir($dirslsitss, 0777);
- }
- //匹配圖片的src
- preg_match_all('#<img.*?src="([^"]*)"[^>]*>#i', $xstr, $match);
- foreach($match[1] as $imgurl){
- $imgurl = $imgurl;
- if(is_int(strpos($imgurl, 'http'))){
- $arcurl = $imgurl;
- } else {
- $arcurl = $oriweb.$imgurl;
- }
- $img=file_get_contents($arcurl);
- if(!emptyempty($img)) {
- //保存圖片到服務器
- $fileimgname = time()."-".rand(1000,9999).".jpg";
- $filecachs=$dirslsitss."/".$fileimgname;
- $fanhuistr = file_put_contents( $filecachs, $img );
- $saveimgfile = "/uploads/$keyword"."/".$d."/".$fileimgname;
- $xstr=str_replace($imgurl,$saveimgfile,$xstr);
- }
- }
- return $xstr;
- }
可能有些朋友也知道file_get_contents性能不怎么樣,我們可使用curl來獲取,代碼如下:
- /*
- *功能:php完美實現下載遠程圖片保存到本地
- *參數:文件url,保存文件目錄,保存文件名稱,使用的下載方式
- *當保存文件名稱為空時則使用遠程文件原來的名稱
- */
- function getImage($url,$save_dir='',$filename='',$type=0){
- if(trim($url)==''){
- return array('file_name'=>'','save_path'=>'','error'=>1);
- }
- if(trim($save_dir)==''){
- $save_dir='./';
- }
- if(trim($filename)==''){//保存文件名
- $ext=strrchr($url,'.');
- if($ext!='.gif'&&$ext!='.jpg'){
- return array('file_name'=>'','save_path'=>'','error'=>3);
- }
- $filename=time().$ext;
- }
- if(0!==strrpos($save_dir,'/')){
- $save_dir.='/';
- }
- //創建保存目錄
- if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
- return array('file_name'=>'','save_path'=>'','error'=>5);
- }
- //獲取遠程文件所采用的方法
- if($type){
- $ch=curl_init();
- $timeout=5;
- curl_setopt($ch,CURLOPT_URL,$url);
- curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
- curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
- $img=curl_exec($ch);
- curl_close($ch);
- }else{
- ob_start();
- readfile($url);
- $img=ob_get_contents();
- ob_end_clean();
- }
- //$size=strlen($img);
- //文件大小
- $fp2=@fopen($save_dir.$filename,'a');
- fwrite($fp2,$img);
- fclose($fp2);
- unset($img,$url);
- return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
- }
|
新聞熱點
疑難解答