zoukankan      html  css  js  c++  java
  • Snoopy+phpquery采集demo

    用phpquery类,写了个采集的demo,以 某网贷平台的 一个列表为例,我们要采集该平台下面的 各平台名称,结构树如下

     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" />

    pq("input[name='sss']")->html()/text() 是无效的。。  

    要使用attr方法
    pq("input[name='sss']")->attr("value");

    采集结果如下:

    这里要考虑到一个问题,如果采集的页面的分页链接是有分页信息的自然最好,就想我现在采集的这个网站,网站分页是用ajax加载一个url,提交页码数,返回json数据来渲染页面的,并非链接跳转第N页。

    那么我们怎么做呢,phpquery显然不足以完成这些,所以我考虑到了snoopy,他不但可以采集,还可以模拟响应信息,模拟表单自然不在话下。但是dom操作没有phpquery那么人性化,所以两者结合自然是

    最好的。

    1,抓取http响应

    得到信息:点击N页的时候 需要 提交 currPage=N 和 sort=0 两个参数  至   http://www.wangdaizhijia.com/front_select-plat

    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; //输出返回结果

    我需要遍历所有记录,所以我需要知道总页数,来决定循环请求的次数。

    其实返回记录里面已经有了。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)//这个有可能会报错

  • 相关阅读:
    环形数组求最大子数组
    教学楼电梯调度需求分析
    结对编程实践扩展
    《梦断代码》读书笔记
    CS小分队第二阶段冲刺站立会议(5月30日)
    CS小分队第二阶段冲刺站立会议(5月29日)
    CS小分队第二阶段冲刺站立会议(5月28日)
    第一阶段冲刺个人总结
    CS小分队第二阶段冲刺站立会议(5月27日)
    CS小分队第二阶段冲刺站立会议(5月26日)
  • 原文地址:https://www.cnblogs.com/findgor/p/4955321.html
Copyright © 2011-2022 走看看