我們在開發網絡程序時,往往需要抓取非本地文件,一般情況下都是利用php模擬瀏覽器的訪問,通過http請求訪問url地址, 然后得到html源代碼或者xml數據,得到數據我們不能直接輸出,往往需要對內容進行提取,然后再進行格式化,以更加友好的方式顯現出來。
下面簡單說一下php抓取頁面的幾種方法及原理:
一、 PHP抓取頁面的主要方法:
1. file()函數
2. file_get_contents()函數
3. fopen()->fread()->fclose()模式
4.curl方式
5. fsockopen()函數 socket模式
6. 使用插件(如:http://sourceforge.net/projects/snoopy/)
二、PHP解析html或xml代碼主要方式:
1. file()函數
1 <?php 2 //定義url 3 $url='http://t.qq.com'; 4 //fiel函數讀取內容數組 5 $lines_array=file($url); 6 //拆分數組為字符串 7 $lines_string=implode('',$lines_array); 8 //輸出內容,嘿嘿,大家也可以保存在自己的服務器上 9 echo $lines_string;
2. file_get_contents()函數
使用file_get_contents和fopen必須空間開啟allow_url_fopen。方法:編輯php.ini,設置 allow_url_fopen = On,allow_url_fopen關閉時fopen和file_get_contents都不能打開遠程文件。
1 <?php 2 //定義url 3 $url='http://t.qq.com'; 4 //file_get_contents函數遠程讀取數據 5 $lines_string=file_get_contents($url); 6 //輸出內容,嘿嘿,大家也可以保存在自己的服務器上 7 echo htmlspecialchars($lines_string);
3. fopen()->fread()->fclose()模式
1 <?php 2 //定義url 3 $url='http://t.qq.com'; 4 //fopen以二進制方式打開 5 $handle=fopen($url,"rb"); 6 //變量初始化 7 $lines_string=""; 8 //循環讀取數據 9 do{ 10 $data=fread($handle,1024); 11 if(strlen($data)==0) { 12 break; 13 } 14 $lines_string.=$data; 15 }while(true); 16 //關閉fopen句柄,釋放資源 17 fclose($handle); 18 //輸出內容,嘿嘿,大家也可以保存在自己的服務器上 19 echo $lines_string;
4. curl方式
使用curl必須空間開啟curl。方法:windows下修改php.ini,將extension=php_curl.dll前面的分號去掉,而且需 要拷貝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安裝curl擴展。
1 <?php 2 // 創建一個新cURL資源 3 $url='http://t.qq.com'; 4 $ch=curl_init(); 5 $timeout=5; 6 // 設置URL和相應的選項 7 curl_setopt($ch, CURLOPT_URL, $url); 8 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 9 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 10 // 抓取URL 11 $lines_string=curl_exec($ch); 12 // 關閉cURL資源,並且釋放系統資源 13 curl_close($ch); 14 //輸出內容,嘿嘿,大家也可以保存在自己的服務器上 15 echo $lines_string;
5. fsockopen()函數 socket模式
socket模式能否正確執行,也跟服務器的設置有關系,具體可以通過phpinfo查看服務器開啟了哪些通信協議。
1 <?php 2 $fp = fsockopen("t.qq.com", 80, $errno, $errstr, 30); 3 if (!$fp) { 4 echo "$errstr ($errno)<br />\n"; 5 } else { 6 $out = "GET / HTTP/1.1\r\n"; 7 $out .= "Host: t.qq.com\r\n"; 8 $out .= "Connection: Close\r\n\r\n"; 9 fwrite($fp, $out); 10 while (!feof($fp)) { 11 echo fgets($fp, 128); 12 } 13 fclose($fp); 14 }
6. snoopy插件,最新版本是Snoopy-1.2.4.zip Last Update: 2013-05-30,推薦大家使用
使用網上非常流行的snoopy來進行采集,這是一個非常強大的采集插件,並且它的使用非常方便,你也可以在里面設置agent來模擬瀏覽器信息。
1 <?php 2 //引入snoopy的類文件 3 require('Snoopy.class.php'); 4 //初始化snoopy類 5 $snoopy = new Snoopy; 6 $url = "http://t.qq.com"; 7 //開始采集內容 8 $snoopy->fetch($url); 9 //保存采集內容到$lines_string 10 $lines_string = $snoopy->results; 11 //輸出內容,嘿嘿,大家也可以保存在自己的服務器上 12 echo $lines_string;
說明:設置agent是在 Snoopy.class.php 文件的第45行,請在該文件中搜索 “var $agent” (引號中的內容)。瀏覽器內容你可以使用PHP來獲得,
使用 echo $_SERVER['HTTP_USER_AGENT']; 可以得到瀏覽器信息,將echo出來的內容復制到agent里面就可以了。