例子,php抓取網站資料的程式碼。
-
-
/**
- * 一個用來抓取圖片的類別
- *
- * @package default
- * @author WuJunwei
- */
- class download_image
- {
-
- public $save_path;抓取圖片的保存位址
-
- //抓取圖片的大小限制(單位:位元組) 只抓比size比這個限制大的圖片
- public $img_size=0;
-
- //定義一個靜態陣列,用來記錄曾經抓取過的的超連結位址,避免重複抓取
- public static $a_url_arr=array();
-
- /**
- * @param String $save_path 抓取圖片的保存位址
- * @param Int $img_size 抓取圖片的保存位址
- * /
- public function __construct($save_path,$img_size)
- {
- $this->save_path=$save_path;
- $this->img_size=$img_size
- }
-
- ; 🎜> /**
- * 遞歸下載抓取首頁及其子頁圖片的方法 ( recursive 遞歸)
- *
- * @param String $capture_url 用於抓取圖片的網址
- *
- */
- public function recursive_download_images($capture_url)
- {
- if (!in_array($capture_url,self::$a_url_arr)) //沒抓取
- {
- self::$a_url_arr[]=$capture_url; //計入靜態陣列
- } else //抓取過,直接退出函數
- {
- return;
- }
-
- $this->download_current_page_images($capture_url); //下載目前頁面的所有圖片
-
- //用@屏蔽掉因為抓取位址無法讀取導致的warning錯誤
- $ content=@file_get_contents($capture_url);
-
- //符合a標籤href屬性中?之前部分的正規
- $a_pattern = "|]+href=['" ]? ([^ '"?]+)['" >]|U";
- preg_match_all($a_pattern, $content, $a_out, PREG_SET_ORDER);
-
- $tmp_arr=array(); //定義一個陣列,用來存放目前迴圈下抓取圖片的超連結位址
- foreach ($a_out as $k => $v)
- {
- /**
- * 去除超連結中的空'','#','/'和重複值
- * 1: 超連結位址的值不能等於目前抓取頁面的url, 否則會陷入死循環
- * 2: 超連結為''或'#','/'也是本頁,這樣也會陷入死循環,
- * 3: 有時一個超連接地址在一個網頁中會重複出現多次,如果不去除,會對一個子頁面進行重複下載)
- */
- if ( $v[1] && !in_array($v[1],self::$a_url_arr) &&!in_array($v[1],array('#','/',$capture_url) ) )
- {
- $tmp_arr[]=$v[1];
- }
- }
-
- foreach ($tmp_arr as $k => $v)
- {
- / /超連結路徑位址
- if ( strpos($v, 'http://')!==false ) //如果url包含http://,可以直接存取
- {
- $a_url = $v;
- }else //否則證明是相對位址, 需要重新拼湊超連結的存取位址
- {
- $domain_url = substr($capture_url, 0,strpos($capture_url, '/', 8)+1);
- $a_url=$domain_url.$v;
- }
-
- $this->recursive_download_images($a_url);
-
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- /**
- * 下載目前網頁下的所有圖片
- *
- * @param String $capture_url 用於抓取圖片的網頁位址
- * @return Array 目前網頁上所有圖片img標籤url位址的一個數組
- */
- public function download_current_page_images($capture_url)
- { $content=@file_get_contents($capture_url); //屏蔽錯誤 $content=@file_get_contents($capture_url); //屏蔽錯誤 符合img標籤src屬性中?之前部分的正規 $img_pattern = "|]+src=['" ]?([^ '"?]+)['" >]|U" ; preg_match_all($img_pattern, $content, $img_out, PREG_SET_ORDER); $photo_num = count($img_out); //符合到的圖片數量 echo '
'.$capture_url . "共找到" . $photo_num . " 張圖片"; foreach ($img_out as $k => $v) { $this->save_one_img ($capture_url,$v[1]); } }
-
- /**
- * 儲存單一圖片的方法
- *
- * @param String $capture_url 用來抓取圖片的網頁位址
- * @param String $img_url 需要儲存的圖片的url
- *
- */
- public function save_one_img($capture_url,$img_url)
- {
- //圖片路徑位址
- if ( strpos($img_url, ' http://')!==false )
- {
- // $img_url = $img_url;
- }else
- {
- $domain_url = substr($capture_url, 0,strpos( $capture_url, '/',8)+1);
- $img_url=$domain_url.$img_url;
- }
- $pathinfo = pathinfo($img_url); //取得圖片路徑資訊
- $pic_name=$pathinfo['basename']; //取得圖片的名稱
- if (file_exists($this->save_path.$pic_name)) //如果圖片存在,證明已經被抓取過,退出函數
- {
- echo $img_url . '該圖片已經抓取過!
';
- return;
- }
- //將圖片內容讀入一個字串
- $img_data = @file_get_contents($img_url); //屏蔽掉因為圖片位址無法讀取導致的warning錯誤
- if ( strlen( $img_data) > $this->img_size ) //下載size比限制大的圖片
- {
- $img_size = file_put_contents($this->save_path . $pic_name, $img_data);
- if ($ img_size)
- {
- echo $img_url . '圖片儲存成功!
';
- } else
- {
- echo $img_url . '圖片儲存失敗!
';
- }
- } else
- {
- echo $img_url . '圖片讀取失敗!
';
- }
- }
- } // END
-
- set_time_limit(120); //設定腳本的最大執行時間依情況設定
- $download_img=new download_image('E:/images/',0); //實例化下載圖片物件
- $download_img->recursive_download_images('http://bbs.it-home.org/'); //遞迴抓取圖片方法
- //$download_img->download_current_page_images( $_POST['capture_url']); //只抓取目前頁面圖片方法
- ?>
複製程式碼
|