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)//这个有可能会报错

相关文章
相关标签/搜索