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

 include 'phpQuery.php';

 phpQuery::newDocumentFile('http://www.wangdaizhijia.com/dangan/');//获取Dom文档

 $artlist = pq(".terraceList")->find('.item .nameBox .name');//筛选节点

 //echo count($arrlist)  //数量

 foreach($artlist as $k=>$v){
echo pq($artlist)->find("a:eq($k)")->text()."<br/>";// text方法只文本,html方法含html代码
}

注意: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元素的值嘛。

 $snoopy=new Snoopy;

 $url="http://www.wangdaizhijia.com/front_select-plat";

 $snoopy->submit($url,array('currPage'=>1,'sort'=>0));

 $index=$snoopy->results;//第一页

 $index_arr=json_decode($index,1);//转化数组

 $pageCount=$index_arr['pageCount'];//总页数

 $data=$index_arr['list'];//首页数据

 //第二页开始,循环采集,并追加至$data
for($i=2;$i<=$pageCount;$i++){
$snoopy->submit($url,array('currPage'=>$i,'sort'=>0));
$res=$snoopy->results;
$res=json_decode($res,1);//转化数组
foreach($res['list'] as $k=>$v){
$data[]=$res['list'][$k];
}
} var_dump($data); //入库....

注意:

1,phpQuery内存占用过大,导致溢出问题

phpQuery在每处理一个网页就会产生一个DOMDocumentWrapper 对象,而每个DOMDocumentWrapper 对象会被保存在静态成员$documents中(phpQuery::createDocumentWrapper中),

这个变量是一个数组,每解析一个 网页数组元素就增加一个。

推荐使用:phpQuery::$documents = array();

unset(phpQuery::$documents)//这个有可能会报错

Snoopy+phpquery采集demo的更多相关文章

  1. phpQuery采集微信公众号文章乱码

    终于找到解决方案了,这是一个值得庆祝的事情.... 原来是因为微信在源码中加入了防采集代码<!--headTrap<body></body><head>< ...

  2. 简单的视频采集demo

    打算做个简单的聊天软件,其中一个我没做过的,就是视频采集. 在网上查了许久资料,终于搞清楚了dshow采集视频的流程 参考资料如下: https://msdn.microsoft.com/en-us/ ...

  3. phpQuery对数据信息的采集进一步学习

    前提:需要下载:phpQuery/phpQuery.php 链接:http://www.cnblogs.com/wuheng1991/p/5145398.html 1.对于规则的部分 <?php ...

  4. phpquery 学习笔记

    phpQuery是一个基于PHP的服务端开源项目,它可以让PHP开发人员轻松处理DOM文档内容,比如获取某新闻网站的头条信息.更有意思的是,它采用了jQuery的思想,你可以像使用jQuery一样处理 ...

  5. Flume NetCat Demo

    准备工作: 1.apache官网下载flume 2.解压flume 3.修改flume-env.sh,配置JAVA_HOME NetCat采集Demo: 1.在conf中创建netcat-logger ...

  6. PHP curl_setopt函数用法介绍中篇

    此篇已实例为主. 一.一般的实例 demo1.php <?php $user = "admin123"; $pass = "admin456"; // $ ...

  7. snoopy采集

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单.Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl Compatible Regular ...

  8. PHP采集利器:Snoopy 试用心得

    Snoopy.class.php下载 Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单.Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl ...

  9. ThinkPHP Http工具类(用于远程采集 远程下载) phpSimpleHtmlDom采集类库_Jquery筛选方式 使用phpQuery轻松采集网页内容http://www.thinkphp.cn/extend/541.html

    [php]代码库 view sourceprint? <?php // +------------------------------------------------------------ ...

随机推荐

  1. 自学android半年,已从.net转型成android程序员,分享下这个过程

    自学从来都是一件难以坚持的事情,看过太多人三分钟热度之后就颓然放弃,然后告诉下一个要自学的人,自学很难,还是正儿八经去培训机构吧 所以首先你要对安卓开发非常感兴趣,发自内心喜欢安卓系统,日常手机如果是 ...

  2. joson返回数据库的时间格式在前台用js转换

    function ChangeDateFormat(val) { if (val != null) { var date = new Date(parseInt(val.replace("/ ...

  3. [转]SSAS没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) (Microsoft Visual Studio)的解决办法

    转自:http://www.cnblogs.com/xvqm00/archive/2011/07/15/2107338.html 打开SSAS 数据源视图浏览数据时,提示 没有注册类别 (异常来自 H ...

  4. 10 个实用技巧,让 Finder 带你飞

    Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组织和使用 Mac 里的几乎所有东西,包括应用程序.文件 ...

  5. <Interview Problem>最小的“不重复数”

    百度的一道笔试题目,看到博客园讨论挺热烈的,也写一下玩玩. 实现思想:举个简单的例子11233,从高位到低位开始判断是否有重复数,高位有重复数后,首先修改高位的,高位修改后变为12233,因为要求最小 ...

  6. IOS 截取图片 部分 并生成新图片

    /** * 从图片中按指定的位置大小截取图片的一部分 * * @param image UIImage image 原始的图片 * @param rect CGRect rect 要截取的区域 * * ...

  7. java性能监控常用命令

    jps -m -l:主要用来输出JVM中运行的进程状态信息 jstack -l pid 来观察锁持有情况 jsatck pid | grep pid(十六进制):输出进程pid的堆栈信息 jmap - ...

  8. Mac 快捷键

    总结一下: Ctrl + 关机:弹出关机提示 Ctrl + Opt + 关机 : 正常关机快捷键 Cmd + Opt + 关机 :休眠 Ctrl + Cmd + 关机:重启 Shift + Ctrl ...

  9. HTML 5 应用程序缓存(下)

    Manifest 文件manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容). manifest 文件可分为三个部分: CACHE MANIFEST - 在此标题下列出的 ...

  10. 2017年1月1日 星期日 --出埃及记 Exodus 21:27

    2017年1月1日 星期日 --出埃及记 Exodus 21:27 And if he knocks out the tooth of a manservant or maidservant, he ...