介绍
我们有时需要抓取一个网页的内容,但只需要特定部分的信息,通常会用正则来解决,这当然没有问题。正则是一个通用解决方案,但特定情况下,往往有更简单快 捷的方法。比如你想查询一个编程方面的问题,当然可以使用Google,但stackoverflow 作为一个专业的编程问答社区,会提供给你更多,更靠谱的答案。
对于html页面,不应该使用正则的原因主要有3个
- 1、编写条件表达式比较麻烦
尤其对于新手,看到一堆”不知所云”的字符评凑在一起,有种脑袋都要炸了的感觉。如果要分离的对象没有太明显的特征,正则写起来更是麻烦。- 2、效率不高
对于php来说,正则应该是没有办法的办法,能通过字符串函数解决的,就不要劳烦正则了。用正则去处理一个30多k的文件,效率不敢保证。- 3、有phpQuery
如果你使用过jQuery,想获取某个特定元素应该是轻而易举的事情,phpQuery让这成为了可能。
在介绍QueryList之前,有必要先来介绍一下phpQuery。
phpQuery是一个用php实现的类似jQuery的开源项目,可以在服务器端以jQuery的语法形式解析网页元素。
基本上jQuery的选择器都可以用在phpQuery上,phpQuery很强大可以对DOM进行任何复杂的操作,而接下来要介绍的QueryList则相当于phpQuery的子集,发挥它采集方面的强大功能。
QueryList
QueryList是一个基于phpQuery的PHP通用列表采集类,得益于phpQuery,让使用QueryList几乎没有任何学习成本,只要会CSS3选择器就可以轻松使用QueryList了,它让PHP做采集像jQuery选择元素一样简单。
QueryList的几个特点:
- 1.只有一个核心的API,静态方法Query
- 2.用jQuery选择器来选择页面元素
- 3.自带过滤功能,可过滤掉无用的内容
- 4.支持无限层级嵌套采集
- 5.采集结果直接以采集规则以列表的形式有序的返回
- 6.支持扩展
4.0更新:
- 完全重写整个底层
- 完全composer化,不再支持手动安装
- PHP版本必须大于PHP7
- 更加模块化,更容易扩展
- 内置了强大的http插件和编码转换插件
- 拥有几乎所有与jQuery操作DOM完全相同的API
安装QueryList
QueryList拥有与jQuery
几乎完全相同的选择器规则和DOM操作API,使用QueryList之前请确保你对jQuery有所了解以及对CSS3选择器所有了解;QueryList完全依赖Composer
,请确保你会使用Composer.
注:如果你的PHP版本还停留在PHP5,或者不会使用Composer,你可以选择使用QueryList3,QueryList3支持php5.3以及手动安装。
QueryList3 文档:http://v3.querylist.cc
环境要求
- PHP >= 7.0
安装
执行composer命令:
composer require jaeger/querylist
如果composer安装速度太慢,可以尝试执行下面命令更换国内镜像:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
使用
使用QueyList只需要编写规则库,然后把规则库传给QueryList的rules()
,QueryList就会自动按照规则库把内容全部采集回来了,而规则库是用jQuery选择器来编写的,所以使用QueryList的整个过程非常简单!
规则库的编写规则如下(简单模式):
$rules = array( '规则名' => array('jQuery选择器','要采集的属性'), '规则名2' => array('jQuery选择器','要采集的属性'), .......... );
下面我们来动手试试吧:
1.采集目标,下面的代码片段
$html = <<<STR <div id="one"> <div class="two"> <a href="http://querylist.cc">QueryList 官网</a> <img src="http://querylist.com/1.jpg" alt="这是图片"> <img src="http://querylist.com/2.jpg" alt="这是图片 2"> </div> <span>其它的<b>一些</b>文本</span> </div> STR;
2.编写采集规则
$rules = array( //采集id为one这个元素里面的纯文本内容 'text' => array('#one','text'), //采集class为two下面的超链接的链接 'link' => array('.two>a','href'), //采集class为two下面的第二张图片的链接 'img' => array('.two>img:eq(1)','src'), //采集span标签中的HTML内容 'other' => array('span','html') );
3.开始采集
// 过程:设置 HTML=>设置采集规则=>执行采集=>获取采集结果数据 $data = QueryList::html($html)->rules($rules)->query()->getData(); //打印结果 print_r($data->all());
结果如下:
Array ( [0] => Array ( [text] => QueryList 官网 其它的一些文本 [link] => http://querylist.cc [img] => http://querylist.com/2.jpg [other] => 其它的<b>一些</b>文本 ) )
如果上面的代码你看懂了,那么恭喜你,你已经成功掌握了QueryList了!
下面是完整代码:
<?php require 'QueryList/vendor/autoload.php'; use QL\QueryList; $html = <<<STR <div id="one"> <div class="two"> <a href="http://querylist.cc">QueryList 官网</a> <img src="http://querylist.com/1.jpg" alt="这是图片"> <img src="http://querylist.com/2.jpg" alt="这是图片 2"> </div> <span>其它的<b>一些</b>文本</span> </div> STR; $rules = array( //采集 id 为 one 这个元素里面的纯文本内容 'text' => array('#one','text'), //采集 class 为 two 下面的超链接的链接 'link' => array('.two>a','href'), //采集 class 为 two 下面的第二张图片的链接 'img' => array('.two>img:eq(1)','src'), //采集 span 标签中的 HTML 内容 'other' => array('span','html') ); $data = QueryList::html($html) ->rules($rules) ->query() ->getData(); print_r($data->all());
相关连接
QueryList生态:
QueryList GIT访问地址: http://git.querylist.cc
QueryList官网: http://querylist.cc
QueryList问答: http://wenda.querylist.cc
QueryList指导文档: http://doc.querylist.cc
QueryList GitHub地址: https://github.com/jae-jae/QueryList
QueryList GIT@OSC地址: http://git.oschina.net/jae/QueryList
Packagist地址: https://packagist.org/packages/jaeger/querylist