我們?cè)陂_(kāi)發(fā)網(wǎng)絡(luò)程序時(shí)蜻展,往往需要抓取非本地文件,一般情況下都是利用php模擬瀏覽器的訪(fǎng)問(wèn)邀摆,通過(guò)http請(qǐng)求訪(fǎng)問(wèn)url地址纵顾, 然后得到html源代碼或者xml數(shù)據(jù),得到數(shù)據(jù)我們不能直接輸出栋盹,往往需要對(duì)內(nèi)容進(jìn)行提取施逾,然后再進(jìn)行格式化,以更加友好的方式顯現(xiàn)出來(lái)贞盯。
下面簡(jiǎn)單說(shuō)一下php抓取頁(yè)面的幾種方法及原理:
一音念、 PHP抓取頁(yè)面的主要方法:
file()函數(shù)
file_get_contents()函數(shù)
fopen()->fread()->fclose()模式
4.curl方式
fsockopen()函數(shù) socket模式
二、PHP解析html或xml代碼主要方式:
- file()函數(shù)
<?php
//定義url
$url='http://t.qq.com';
//fiel函數(shù)讀取內(nèi)容數(shù)組
$lines_array=file($url);
//拆分?jǐn)?shù)組為字符串
$lines_string=implode('',$lines_array);
//輸出內(nèi)容躏敢,嘿嘿闷愤,大家也可以保存在自己的服務(wù)器上
echo $lines_string;
- file_get_contents()函數(shù)
使用file_get_contents和fopen必須空間開(kāi)啟allow_url_fopen。方法:編輯php.ini件余,設(shè)置 allow_url_fopen = On讥脐,allow_url_fopen關(guān)閉時(shí)fopen和file_get_contents都不能打開(kāi)遠(yuǎn)程文件。
<?php
//定義url
$url='http://t.qq.com';
//file_get_contents函數(shù)遠(yuǎn)程讀取數(shù)據(jù)
$lines_string=file_get_contents($url);
//輸出內(nèi)容啼器,嘿嘿旬渠,大家也可以保存在自己的服務(wù)器上
echo htmlspecialchars($lines_string);
- fopen()->fread()->fclose()模式
<?php
//定義url
$url='http://t.qq.com';
//fopen以二進(jìn)制方式打開(kāi)
$handle=fopen($url,"rb");
//變量初始化
$lines_string="";
//循環(huán)讀取數(shù)據(jù)
do{
$data=fread($handle,1024);
if(strlen($data)==0) {
break;
}
$lines_string.=$data;
}while(true);
//關(guān)閉fopen句柄,釋放資源
fclose($handle);
//輸出內(nèi)容端壳,嘿嘿告丢,大家也可以保存在自己的服務(wù)器上
echo $lines_string;
- curl方式
使用curl必須空間開(kāi)啟curl。方法:windows下修改php.ini损谦,將extension=php_curl.dll前面的分號(hào)去掉岖免,而且需 要拷貝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下岳颇;Linux下要安裝curl擴(kuò)展。
<?php
// 創(chuàng)建一個(gè)新cURL資源
$url='http://t.qq.com';
$ch=curl_init();
$timeout=5;
// 設(shè)置URL和相應(yīng)的選項(xiàng)
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
// 抓取URL
$lines_string=curl_exec($ch);
// 關(guān)閉cURL資源颅湘,并且釋放系統(tǒng)資源
curl_close($ch);
//輸出內(nèi)容话侧,嘿嘿,大家也可以保存在自己的服務(wù)器上
echo $lines_string;
- fsockopen()函數(shù) socket模式
socket模式能否正確執(zhí)行闯参,也跟服務(wù)器的設(shè)置有關(guān)系瞻鹏,具體可以通過(guò)phpinfo查看服務(wù)器開(kāi)啟了哪些通信協(xié)議。
<?php
$fp = fsockopen("t.qq.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: t.qq.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
- snoopy插件鹿寨,最新版本是Snoopy-1.2.4.zip Last Update: 2013-05-30新博,推薦大家使用
使用網(wǎng)上非常流行的snoopy來(lái)進(jìn)行采集,這是一個(gè)非常強(qiáng)大的采集插件释移,并且它的使用非常方便叭披,你也可以在里面設(shè)置agent來(lái)模擬瀏覽器信息。
<?php
//引入snoopy的類(lèi)文件
require('Snoopy.class.php');
//初始化snoopy類(lèi)
$snoopy = new Snoopy;
$url = "http://t.qq.com";
//開(kāi)始采集內(nèi)容
$snoopy->fetch($url);
//保存采集內(nèi)容到$lines_string
$lines_string = $snoopy->results;
//輸出內(nèi)容玩讳,嘿嘿,大家也可以保存在自己的服務(wù)器上
echo $lines_string;
待完善嚼贡。熏纯。。