当前位置: 首页 > 工具软件 > QueryList > 使用案例 >

php爬虫QueryList使用

赫连开畅
2023-12-01

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.phpQueryList.php这两个文件。

3、手动下载phpQuery.phpQueryList.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)

参数解释:

  • $page 采集的目标页面

类型:string
要抓取的网页URL地址(支持https);或者是html代码片段

  • $rules 采集规则

类型:array

  • $range 区域选择器 (可选)

类型:string
默认值:''

区域选择器或者说范围选择器,指 先按照规则 选出 几个大块 ,然后再分别再在块里面 进行相关的选择。当采集列表的时候,建议设置这个参数。

查看区域选择器例子:http://doc.querylist.cc/site/index/doc/29

  • $outputEncoding 输出编码(可选)

类型:string
默认值:null

指要以什么编码输出(UTF-8,GB2312,…..),防止出现乱码,如果设置null则不改变原字符串编码

  • $inputEncoding 输入编码(可选)

类型:string
默认值:null

明确指定输入的页面编码格式(UTF-8,GB2312,…..),防止出现乱码,如果设置null则自动识别

  • $removeHead  是否移除头部(可选)

类型: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

包含命名空间的类名

参数:$arg1,$arg2,……

可传递任意多个参数


用法

运行下面例子需要先安装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);

 

 类似资料: