kano个人博客详解php信息数据采集工具QueryList

kano个人技术博客 php教程 1,068 次浏览 没有评论

如果你熟悉php技术语言,并且想在某些网站进行文章采集,queryList采集工具将是一个不错的选择。本篇php数据采集实战教程主要是对于采集程序queryList的一个简单介绍,忽略了querylist下载及querylist安装部分,而且是基于QueryList V3版本,目前QueryList已经更新到V4版本,想了解更多详情的话,请移步官网查看querylist手册。

querylist采集工具

QueryList基于phpQuery,phpQuery是一个用php实现的DOM分析工具,语法类似于JQuery(也由此得名),而QueryList相当于基于其上的一个扩展。如果你使用过JQuery的话(甚至只要你会css的话),你会发现querylist教程几乎没有什么学习成本而querylist的作用却非常强大,类似关键词采集系统插件、论坛采集、dedecms采集、淘宝采集,包括各种视频、图片、小说、新闻、文章等各种网页的系统采集都有着密切的联系。而querylist采集开发的底层是基于php curl采集之上发送请求的,如下图kano截取了querylist爬虫源代码,可以很清楚的看到其配置的相关参数。

个人博客采集源码

那么我们就先来看一个简单的querylist用法例子,比如我们想获取豆瓣网首页的所有图片的地址:

1. $data = QueryList::Query('http://www.douban.com/', ['img' => ['img', 'src']])->data;  
2. dump($data);

结果:

1. array(73) {  
2.   [0] => array(1) {  
3.     ["img"] => string(37) "https://www.douban.com/pics/blank.gif"  
4.   }  
5.   [1] => array(1) {  
6.     ["img"] => string(114) "https://img3.doubanio.com/f/sns/0c708de69ce692883c1310053c5748c538938cb0/pics/sns/anony_home/icon_qrcode_green.png"  
7.   }  
8.   [2] => array(1) {  
9.     ["img"] => string(113) "https://img3.doubanio.com/f/sns/1cad523e614ec4ecb6bf91b054436bb79098a958/pics/sns/anony_home/doubanapp_qrcode.png"  
10.   }  
......

 是不是非常容易?刨除打印外,实际上的逻辑只用了一行代码(当然主方法Query里面的参数其实应当抽出来作为单独的变量的,而这里主要为了提现一个QueryList的方便之处)

 

稍微解释一下上面的例子,该方法主要的querylist属性有两个,第一个是要采集的资源地址(即页面地址),第二个是采集的规则,第一个参数很好理解,我们来解释一下第二个参数:采集规则是一个数组:

1. $rules = array(  

2.    '规则名' => array('jQuery选择器','要采集的属性'),  

3.    '规则名2' => array('jQuery选择器','要采集的属性'),  

4.     ……….  

5. );  

其中规则名是自己起的,querylist抓取结束后,php采集结果以一个数组的形式返回来,规则每一次匹配到数据都将在结果中插入一个小数组,这个小数组也是键值对的形式,其中的键名就是这里的规则名。JQuery选择器不需要过多解释,即是 “#list .a”,”.aa div” 这样的选择器字符串,要采集的属性是匹配到的标签中的html属性,比如img的src,a标签的href属性等。

实际解释到这里,可以说你已经学会了php querylist,是不是非常简单好用?当然实际的应用中上述的功能还不能完全满足需求,下面对QueryList的功能再做更全面一些的简介。

首先,我们采集的东西很多是不属于html属性的,比如我们其实想采集其中的文字,或者某一段html的话:

1. $rules = [  
2.     'aa_text' => ['#aa', 'text'],  
3.     'bb_html' => ['#bb', 'html']  
4. ];

只要填写text,则会采集源码标签中的文本,并且过滤掉html标签;填写html,则会把标签中的html代码完全的采集回来。

如果你要采集某个列表页其中的文本,但文本元素的内容藏的很深,那你写出来的规则可能是这样的:

1. $rules = [  
2.     'text1' => ['#con1 .bb .cc .dd .text_1', 'text'],  
3.     'text2' => ['#con1 .bb .cc .dd .text_2', 'text'],  
4.     'text3' => ['#con1 .bb .cc .dd .text_3', 'text'],  
5. ];

很冗余,实际Query主方法还有第三个参数,区域选择器,即将要采集信息的内容限定在某个区域中,于是,你可以将代码写成这样:

1. $url = 'http://aaa.bbb.com/';  

2. $rules = [  

3.     'text1' => ['.text_1', 'text'],  

4.     'text2' => ['.text_2', 'text'],  

5.     'text3' => ['.text_3', 'text'],  

6. ];  

7. $range = '#con1 .bb .cc .dd';  

8. $data = QueryList::Query($url, $rules, $range)->data;  

代码看上去一下子简洁了不少

内容过滤:

1. $html = <<<EOT  
2.     <div id="aaa">  
3.         文本  
4.         <span class="tt">tt文本</span>  
5.         <span>啊啊啊</span>  
6.         <p>发发发</p>  
7.     </div>  
8. EOT;

 比如这么一段html(querylist编码也可以从html字符串中采集网站内容),我们想采集#aaa中的文本,但是想将其中的标签都去掉,可以这样:

1. $data = QueryList::Query($html, array(  
2.     'txt' => array('#aaa', 'html', '-span -p')  
3. ))->data;  
4. dump($data);

结果:

1. array(1) {  
2.   [0] => array(1) {  
3.     ["txt"] => string(6) "文本"  
4.   }  
5. }

 还可以删去其中的某个类的标签,保留剩下的文本:

1. $data = QueryList::Query($html, array(  
2.     'txt' => array('#aaa', 'html', '-.tt')  
3. ))->data;  
4. dump($data);

 结果:

1. array(1) {  
2.   [0] => array(1) {  
3.     ["txt"] => string(95) "文本  
4.                 <span>啊啊啊</span>  
5.                 <p>发发发</p>"  
6.   }  
7. }


回调函数:

有些时候,你想获得某个页面中的图片,于是写了下面的代码:

1. $html = <<<EOT  
2.     <div id="aaa">  
3.         <img src="/a.jpg" alt="">  
4.         <img src="/b.jpg" alt="">  
5.     </div>  
6.   
7. $rules = [  
8.     'img' => ['#aaa img', 'src']  
9. ];  
10.   
11. $data = QueryList::Query($html, $rules)->data;  
12. dump($data);

结果:

1. array(2) {  
2.   [0] => array(1) {  
3.     ["img"] => string(6) "/a.jpg"  
4.   }  
5.   [1] => array(1) {  
6.     ["img"] => string(6) "/b.jpg"  
7.   }  
8. }

 发现网页中的图片都是相对的路径,这时需要手动拼接一下所在的域名,或者你可以直接写到规则中进行处理:

1. $domain = 'http://www.douban.com';  
2.   
3. $rules = [  
4.     'img' => ['#aaa img', 'src', null, function($res) use ($domain) {  
5.         return $domain . $res;  
6.     }]  
7. ];  
8.   
9. $data = QueryList::Query($html, $rules)->data;  
10. dump($data);

结果:

1. array(2) {  
2.   [0] => array(1) {  
3.     ["img"] => string(27) "http://www.douban.com/a.jpg"  
4.   }  
5.   [1] => array(1) {  
6.     ["img"] => string(27) "http://www.douban.com/b.jpg"  
7.   }  
8. }

直接在采集的过程中进行的数据处理实现querylist自动采集,可以使代码的逻辑更清晰。这篇kano个人技术博客的采集php教程就介绍到这里了。有更多的想法欢迎一起与kano分享交流。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Go