Tinker-站长

PHP采集工具之Querylist
ph好用的采集类最近有个朋友需要我帮他用php采集一些东西,这里我就不得不提很强大的:querylist官网:ht...
扫描右侧二维码阅读全文
21
2019/08

PHP采集工具之Querylist

ph好用的采集类

最近有个朋友需要我帮他用php采集一些东西,这里我就不得不提很强大的:querylist

官网:http://www.querylist.cc/

简单的介绍一下:QueryList不依赖任何框架和架构,它可以单独使用也可以引入到任意的PHP开发框架中去使用,如:Laravel、ThinkPHP;你可以使用它来构建简单的采集系统,也可以用它才构建高可用的分布式采集系统。它提供了丰富的基于CSS选择器的页面抽取API,完全模块化的设计,拥有强大的可扩展性。

安装

composer require jaeger/querylist

关于composer的安装请大家自行百度.

是不是迫不及待了?别慌,接下来我为你慢慢演示

初探

看看PHP用QueryList做采集到底有多简洁吧!

<?php

use QL\QueryList;

//采集某页面所有的图片
$data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('img')->attrs('src');
//打印结果
print_r($data->all());

//采集某页面所有的超链接和超链接文本内容
//可以先手动获取要采集的页面源码
$html = file_get_contents('http://cms.querylist.cc/google/list_1.html');
//然后可以把页面源码或者HTML片段传给QueryList
$data = QueryList::html($html)->rules([  //设置采集规则
    // 采集所有a标签的href属性
    'link' => ['a','href'],
    // 采集所有a标签的文本内容
    'text' => ['a','text']
])->query()->getData();
//打印结果
print_r($data->all());

/**
 * 在线测试采集并查看采集结果:http://querylist.cc/querylist-test
 */

进阶

上面的采集结果有很多“杂质”,一定不会满足你的要求,来获取我们真正想要的结果。

<?php

// 采集该页面[正文内容]中所有的图片
$data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('.post_content img')->attrs('src');
//打印结果
print_r($data->all());


// 采集该页面文章列表中所有[文章]的超链接和超链接文本内容
$data = QueryList::get('http://cms.querylist.cc/google/list_1.html')->rules([
    'link' => ['h2>a','href','',function($content){
        //利用回调函数补全相对链接
        $baseUrl = 'http://cms.querylist.cc';
        return $baseUrl.$content;
    }],
    'text' => ['h2>a','text']
])->range('.cate_list li')->query()->getData();
//打印结果
print_r($data->all());

全貌

正如你看到的那样,使用QueryList做采集只需要编写采集规则即可!

<?php
/**
 * 下面来完整的演示采集一篇文章页的文章标题、发布日期和文章内容并实现图片本地化
 */

 //引入自动加载文件
require 'vendor/autoload.php';

use QL\QueryList;


//需要采集的目标页面
$page = 'http://cms.querylist.cc/news/566.html';
//采集规则
$reg = [
    //采集文章标题
    'title' => ['h1','text'],
    //采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
    'date' => ['.pt_info','text','-span -a',function($content){
        //用回调函数进一步过滤出日期
        $arr = explode(' ',$content);
        return $arr[0];
    }],
    //采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
    'content' => ['.post_content','html','a -.content_copyright -script']
];
$rang = '.content';
$ql = QueryList::get($page)->rules($reg)->range($rang)->query();

$data = $ql->getData(function($item){
  //利用回调函数下载文章中的图片并替换图片路径为本地路径
  //使用本例请确保当前目录下有image文件夹,并有写入权限
  $content = QueryList::html($item['content']);
  $content->find('img')->map(function($img){
      $src = 'http://cms.querylist.cc'.$img->src;
      $localSrc = 'image/'.md5($src).'.jpg';
      $stream = file_get_contents($src);
      file_put_contents($localSrc,$stream);
      $img->attr('src',$localSrc);
  });
  $item['content'] = $content->find('')->html();
  return $item;
});

//打印结果
print_r($data->all());

我给大家演示一下采集我的博客

blog_cj

<?php
require 'vendor/autoload.php';

use QL\QueryList;

$ql = QueryList::get('https://blog.eirds.cn/');

//获取所有h2标签下的a标签的文本
$data = $ql->find('h2>a')->texts();
print_r($data->all());
//获取所有<span>标签下文本
$data = $ql->find('span')->texts();
print_r($data->all());

只需要简单的配置采集规则.这样就简简单单的完成了一些采集,无需写复杂的正则表达式,如果你有jquery基础,那么操作起来肯定是很溜的.官网的api手册还提供了很多丰富的功能,比如多线程GET,post,以及携带各种参数采集.相信大家都迫不及待的想去尝试了吧,快去操作一下吧

Last modification:August 21st, 2019 at 01:22 pm
If you think my article is useful to you, please feel free to appreciate

One comment

  1. repostone

    非技术的路过。

Leave a Comment