#QueryList# 简单、 灵活、强大的PHP采集工具

介绍

我们有时需要抓取一个网页的内容,但只需要特定部分的信息,通常会用正则来解决,这当然没有问题。正则是一个通用解决方案,但特定情况下,往往有更简单快 捷的方法。比如你想查询一个编程方面的问题,当然可以使用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更新:

  1. 完全重写整个底层
  2. 完全composer化,不再支持手动安装
  3. PHP版本必须大于PHP7
  4. 更加模块化,更容易扩展
  5. 内置了强大的http插件和编码转换插件
  6. 拥有几乎所有与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

本文短地址:
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论