Snoopy+phpquery採集demo

用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)//這個有可能會報錯

相關文章
相關標籤/搜索