用phpquery類,寫了個採集的demo,以 某網貸平臺的 一個列表爲例,咱們要採集該平臺下面的 各平臺名稱,結構樹以下php
1 include 'phpQuery.php'; 2 3 phpQuery::newDocumentFile('http://www.wangdaizhijia.com/dangan/');//獲取Dom文檔 4 5 $artlist = pq(".terraceList")->find('.item .nameBox .name');//篩選節點 6 7 //echo count($arrlist) //數量 8 9 foreach($artlist as $k=>$v){ 10 echo pq($artlist)->find("a:eq($k)")->text()."<br/>";// text方法只文本,html方法含html代碼 11 }
注意:html和text對於獲取表單不太好使。例如<input type="hidden" name="sss" value="testvalue" />html
pq("input[name='sss']")->html()/text() 是無效的。。
要使用attr方法
pq("input[name='sss']")->attr("value");
採集結果以下:ajax
這裏要考慮到一個問題,若是採集的頁面的分頁連接是有分頁信息的天然最好,就想我如今採集的這個網站,網站分頁是用ajax加載一個url,提交頁碼數,返回json數據來渲染頁面的,並不是連接跳轉第N頁。json
那麼咱們怎麼作呢,phpquery顯然不足以完成這些,因此我考慮到了snoopy,他不但能夠採集,還能夠模擬響應信息,模擬表單天然不在話下。可是dom操做沒有phpquery那麼人性化,因此二者結合天然是數組
最好的。app
1,抓取http響應dom
獲得信息:點擊N頁的時候 須要 提交 currPage=N 和 sort=0 兩個參數 至 http://www.wangdaizhijia.com/front_select-platoop
so網站
include "Snoopy.class.php"; $snoopy=new Snoopy; $data=array('currPage'=>2,'sort'=>0);//得到第二頁 $snoopy->submit('http://www.wangdaizhijia.com/front_select-plat',$data); //模擬提交表單 echo $snoopy->results; //輸出返回結果
我須要遍歷全部記錄,因此我須要知道總頁數,來決定循環請求的次數。url
其實返回記錄裏面已經有了。pageCount=95頁,rowCount 記錄數,若是別的網站沒有返回這種信息也要緊,用phpquery去採集總頁數的那個dom元素的值嘛。
1 $snoopy=new Snoopy; 2 3 $url="http://www.wangdaizhijia.com/front_select-plat"; 4 5 $snoopy->submit($url,array('currPage'=>1,'sort'=>0)); 6 7 $index=$snoopy->results;//第一頁 8 9 $index_arr=json_decode($index,1);//轉化數組 10 11 $pageCount=$index_arr['pageCount'];//總頁數 12 13 $data=$index_arr['list'];//首頁數據 14 15 //第二頁開始,循環採集,並追加至$data 16 for($i=2;$i<=$pageCount;$i++){ 17 $snoopy->submit($url,array('currPage'=>$i,'sort'=>0)); 18 $res=$snoopy->results; 19 $res=json_decode($res,1);//轉化數組 20 foreach($res['list'] as $k=>$v){ 21 $data[]=$res['list'][$k]; 22 } 23 } 24 25 var_dump($data); 26 27 //入庫....
注意:
1,phpQuery內存佔用過大,致使溢出問題
phpQuery在每處理一個網頁就會產生一個DOMDocumentWrapper 對象,而每一個DOMDocumentWrapper 對象會被保存在靜態成員$documents中(phpQuery::createDocumentWrapper中),
這個變量是一個數組,每解析一個 網頁數組元素就增長一個。
推薦使用:phpQuery::$documents = array();
unset(phpQuery::$documents)//這個有可能會報錯