1、QueryList手册:https://www.php.cn/course/371.html
QueryList V4版本文档: https://querylist.cc/docs/guide/v4/
2、下载QueryList:https://www.php.cn/xiazai/leiku/308,解压得到phpQuery.php
和QueryList.php
这两个文件。
3、手动下载phpQuery.php
和QueryList.php
这两个文件,然后手动引入这两个文件就可以了。
<?php
require 'phpQuery.php';
require 'QueryList.php';
use QL\QueryList;
$hj = QueryList::Query('http://mobile.csdn.net/',array("url"=>array('.unit h1 a','href')));
$data = $hj->getData(function($x){
return $x['url'];
});
print_r($data);
4、使用QueyList只需要编写规则库,然后把规则库传给QueryList的静态方法Query,QueryList就会自动按照规则库把内容全部采集回来了,而规则库是用jQuery选择器来编写的,所以使用QueryList的整个过程非常简单!
规则库的编写规则如下(简单模式):
$rules = array(
'规则名' => array('jQuery选择器','要采集的属性'),
'规则名2' => array('jQuery选择器','要采集的属性'),
..........
);
下面我们来动手试试吧:
(1)采集目标,下面的代码片段
//引入文件
require 'phpQuery.php';
require 'QueryList.php';
//使用QL命名空间下的QueryList类
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;
(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)开始采集
$data = QueryList::Query($html,$rules)->data;
//打印结果
print_r($data);
结果如下:
Array
(
[0] => Array
(
[text] =>
QueryList官网
其它的一些文本
[link] => http://querylist.cc
[img] => http://querylist.com/2.jpg
[other] => 其它的<b>一些</b>文本
)
)
5、API
(1)Query()方法
Query方法为QueryList唯一的主方法,用静态的方式调用。
原型:
QueryList::Query($page,array $rules, $range = ‘’, $outputEncoding = null, $inputEncoding = null,$removeHead = false)
类型:string
要抓取的网页URL地址(支持https);或者是html代码片段
类型:array
类型:string
默认值:''
区域选择器
或者说范围选择器
,指 先按照规则 选出 几个大块 ,然后再分别再在块里面 进行相关的选择。当采集列表的时候,建议设置这个参数。
查看区域选择器例子:http://doc.querylist.cc/site/index/doc/29
类型:string
默认值:null
指要以什么编码输出(UTF-8,GB2312,…..),防止出现乱码,如果设置null
则不改变原字符串编码
类型:string
默认值:null
明确指定输入的页面编码格式(UTF-8,GB2312,…..),防止出现乱码,如果设置null
则自动识别
类型:bool
默认值:false
是否移除页面头部区域,乱码终极解决方案。
注意:当这个参数设置为true
的时候,无法选择页面中head区域里面的内容。
(2)getData( ) 方法
获取采集结果数据的结果数据,并可以进一步处理结果。
补全图片链接,改造采集代码:
$baseUrl = 'http://xxxx.com';
$data = QueryList::Query($html,array(
'image' => array('.two>img','src')
))->getData(function($item) use($baseUrl){
return $baseUrl.$item['image'];
});
print_r($data);
(3)getHtml( ) 方法
返回值:string
获取目标页面源码,主要用于调试。
(4)setQuery( ) 方法
返回值:QueryList对象
重新设置选择器,不会再次重复的取抓取一遍目标页面源码,用于重复采集同一个页面多处的内容。
原型:
setQuery(array $rules, $range = ‘’,$outputEncoding = null, $inputEncoding = null,$removeHead = false)
参数解释同Query
//采集文本
$ql = QueryList::Query($html,array(
'txt' => array('span:eq(0)','text')
));
print_r($ql->data);
//采集图片
$ql->setQuery(array(
'image' => array('.xx img','src')
));
print_r($ql->data);
采集结果:
Array
(
[0] => Array
(
[txt] => xxxxxxxx
)
)
Array
(
[0] => Array
(
[image] => /path/to/1.jpg
)
)
**/
(5)run( ) 方法
返回值:需查看对应的插件文档
运行QueryList扩展
原型:
run($class,$args = array())
参数: $class
类型:string
插件名称
参数: $args
类型:array
传递给插件的参数
$login = QueryList::run('Login',[
'target' => 'http://xxx.com/login.php',
'method' => 'post',
'params' => ['username'=>'admin','password'=>'admin'],
'cookiePath' => './cookie123.txt'
]);
//........
(6)getInstance( ) 方法
返回值:实例对象
获取任意类的单例,QueryList内部方法,开放出来供大家使用。
原型:
getInstance($class,$arg1,$arg2,……)
参数: $class
类型:string
包含命名空间的类名
可传递任意多个参数
运行下面例子需要先安装Http
库:
composer require jaeger/http
<?php
require 'vendor/autoload.php';
use QL\QueryList;
$http = QueryList::getInstance(QL\Ext\Lib\Http::class);
$html = $http->get('http://www.baidu.com');
print_r($html);