天天看點

php抓取頁面的幾種方法詳解

本篇文章是對php抓取頁面的幾種方法進行了詳細的分析介紹,需要的朋友參考下

在 做一些天氣預報或者RSS訂閱的程式時,往往需要抓取非本地檔案,一般情況下都是利用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()函數

<?php 

$url='http://t.qq.com'; 

$lines_array=file($url); 

$lines_string=implode('',$lines_array); 

echo htmlspecialchars($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都不能打開遠端檔案。

$lines_string=file_get_contents($url); 

3. fopen()->fread()->fclose()模式

$handle=fopen($url,"rb"); 

$lines_string=""; 

do{ 

    $data=fread($handle,1024);

     if(strlen($data)==0) {

        break;

    } 

    $lines_string.=$data; 

}while(true); 

fclose($handle); 

echo htmlspecialchars($lines_string);

4. curl方式

使用curl必須空間開啟curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需 要拷貝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安裝curl擴充。

$ch=curl_init(); 

$timeout=5; 

curl_setopt($ch, CURLOPT_URL, $url); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

$lines_string=curl_exec($ch); 

curl_close($ch); 

5. fsockopen()函數 socket模式

socket模式能否正确執行,也跟伺服器的設定有關系,具體可以通過phpinfo檢視伺服器開啟了哪些通信協定,比如我的本地php socket沒開啟http,隻能使用udp測試一下了。

<?php                                                                                                                                                

$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);

if (!$fp) { 

    echo "ERROR: $errno - $errstr<br />\n"

} else { 

    fwrite($fp, "\n")

    echo fread($fp, 26)

    fclose($fp)

}  

6. 插件

網上應該有比較多的插件,snoopy插件是在網上搜到的,有興趣的可以研究一下。

如何聯系我:【萬裡虎】www.bravetiger.cn

【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)

【部落格】http://www.cnblogs.com/kenshinobiy/