王小潔
(山西職業(yè)技術(shù)學院,山西 太原 030006)
PHP提供了多種數(shù)據(jù)采集方法,如使用snoopy、simple_html_dom、socket等,為人們采集網(wǎng)絡數(shù)據(jù)提供了極大便利,文章闡述本人在實踐中常用的幾種方法[1]。
使用file_get_contents()函數(shù)進行數(shù)據(jù)采集首先需要確定要采集的網(wǎng)址,然后使用該函數(shù)對網(wǎng)頁進行采集,接著對采集結(jié)果使用正則表達式對需要采集的數(shù)據(jù)進行精確匹配,最后輸出采集結(jié)果。以抓取某網(wǎng)站的圖片為例,代碼框架如下:
$url="http://www.***.com";
$data=file_get_contents($url);
echo "
";print_r($arr);
上述代碼描述中“***”是根據(jù)實際情況確定的網(wǎng)址及源代碼中的類名等,后續(xù)代碼中含義相同。
2 使用curl函數(shù)采集數(shù)據(jù)
curl函數(shù)功能比較強大,可以模擬get請求、post請求、文件上傳等,是較好的數(shù)據(jù)采集工具。使用file_get_contents()函數(shù)進行數(shù)據(jù)采集前需要開啟curl擴展。通過實踐,得出比較完整的采集過程需要六個步驟,第一步初始化curl,即創(chuàng)建一個新的curl資源,第二步設置請求參數(shù),如設置需要抓取的網(wǎng)址、數(shù)據(jù)以文件流的方式返回等,第三步發(fā)送請求,第四步結(jié)合正則表達式進行精確數(shù)據(jù)抓取,第五步輸出抓取結(jié)果,第六步關(guān)閉請求,代碼框架如下:
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.***.com");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
$data=curl_exec($ch);
preg_match_all('***',$data,$arr);
var_dump($arr);
curl_close($ch);
3 使用QueryList工具采集數(shù)據(jù)
目前QueryList 最新版本僅支持php7.0 以上,且僅支持composer安裝。實際使用建議采用QueryList 3版本。安裝QueryList前建議先下載composer,然后通過執(zhí)行composer命令安裝QueryList。
使用querylist方法進行數(shù)據(jù)采集,需要導入自動加載文件、導入QueryList類、制定采集規(guī)則、抓取數(shù)據(jù)、輸出結(jié)果等步驟,以獲取某網(wǎng)站title為例,代碼可以參照下列代碼框架進行編寫:
include "***/autoload.php";
use QLQueryList;
$url="http://www.***.com";
$reg=array(
"title"=>array("title", 'text'),
);
$data=QueryList::Query($url,$reg)->data;
echo "
";print_r($data);
如想抓取網(wǎng)站某條新聞的標題、圖片、描述信息等,只需更改規(guī)則,如做如下更改:
$reg=array(
"title"=>array("此處為某條信息標題的所在的類名、標簽名",'html'),
"img"=>array("此處為新聞圖片所在的類名、標簽名",'src'),
"description"=>array("此處為新聞的描述信息所在的類名、標簽名",'html'),
);
4 使用curl與 QueryList,二者結(jié)合起來采集數(shù)據(jù)
在此,以抓取某網(wǎng)站圖片為例,闡述思路及代碼框架,編程步驟如下:。
1)確定網(wǎng)址
$url="http://www.***.com/";
2)制定抓取規(guī)則
$reg=array(
"img"=>array("*** img",'src','','checkurl'),
);
此處checkurl為回調(diào)函數(shù),目的是拼接完整域名。函數(shù)如下:
function checkurl($a){
return "http://www.***.com".$a;
}
3)采集數(shù)據(jù)
$data=Querylist::Query($url,$reg)->data;
4)下載圖片
在執(zhí)行程序之前,應在當前目錄中建立imgdown文件夾,以保存下載的圖片。
foreach($data as $key=>$value){
$file= $value['img'];
$newFile="./imgdown/".basename($file);
downImg($file,$newFile);
}
downImg為下載函數(shù),該函數(shù)的功能使用curl函數(shù)來實現(xiàn),通過創(chuàng)建資源、設置請求參數(shù)、發(fā)送請求、數(shù)據(jù)抓取,輸出抓取結(jié)果、關(guān)閉請求等步驟實現(xiàn)了圖片的下載功能,代碼如下:
function downImg($file,$newFile){
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmp=curl_exec($ch);
curl_close($ch);
file_put_contents($newFile, $tmp);
}
運行程序,可以在imgdown文件夾中看到下載的圖片。
5 結(jié)語
上述三種數(shù)據(jù)采集方法各有特點,也因地制宜應用于不同的采集需求。一般來說,CURL 效率比file_get_contents 要高很多;CURL 支持的方式比較多,如支持get、post、文件上傳等,而file_get_contents只支持get請求;CURL 的復雜程度高于file_get_contents。QueryList采用CSS選擇器做采集,不需要復雜的正則表達式,能很容易就可以獲取所需的內(nèi)容,使代碼易懂易維護,并且提供了豐富的多線程、圖片下載等功能插件[2],還具備強大的DOM操作能力,是簡潔高效的PHP數(shù)據(jù)采集工具。在實際采集過程中,三者可以結(jié)合使用,更好地達到采集目的。
猜你喜歡2023年6月全宅影音器材編輯推薦 家庭影院技術(shù)(2023年7期)2023-07-14 08:55:56本刊網(wǎng)址變更通知 中華肩肘外科電子雜志(2021年2期)2021-11-30 08:59:55創(chuàng)世代碼 動漫星空(2018年11期)2018-10-26 02:24:02創(chuàng)世代碼 動漫星空(2018年2期)2018-10-26 02:11:00創(chuàng)世代碼 動漫星空(2018年9期)2018-10-26 01:16:48創(chuàng)世代碼 動漫星空(2018年5期)2018-10-26 01:15:02無懼標簽 Alfa Romeo Giulia 200HP 車迷(2018年11期)2018-08-30 03:20:32不害怕撕掉標簽的人,都活出了真正的漂亮 海峽姐妹(2018年3期)2018-05-09 08:21:02標簽化傷害了誰 公民與法治(2016年10期)2016-05-17 04:12:58基于多進制查詢樹的多標簽識別方法 計算機工程(2015年8期)2015-07-03 12:20:27