前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP采集工具之Querylist

PHP采集工具之Querylist

作者头像
天方
发布2022-09-14 11:33:47
1.9K0
发布2022-09-14 11:33:47
举报
文章被收录于专栏:tianfangtianfang

ph好用的采集类

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

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

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

安装

代码语言:txt
复制
composer require jaeger/querylist

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

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

初探

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

代码语言:txt
复制
<?php
代码语言:txt
复制
use QL\QueryList;
代码语言:txt
复制
//采集某页面所有的图片
代码语言:txt
复制
$data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('img')->attrs('src');
代码语言:txt
复制
//打印结果
代码语言:txt
复制
print_r($data->all());
代码语言:txt
复制
//采集某页面所有的超链接和超链接文本内容
代码语言:txt
复制
//可以先手动获取要采集的页面源码
代码语言:txt
复制
$html = file_get_contents('http://cms.querylist.cc/google/list_1.html');
代码语言:txt
复制
//然后可以把页面源码或者HTML片段传给QueryList
代码语言:txt
复制
$data = QueryList::html($html)->rules([  //设置采集规则
代码语言:txt
复制
    // 采集所有a标签的href属性
代码语言:txt
复制
    'link' => ['a','href'],
代码语言:txt
复制
    // 采集所有a标签的文本内容
代码语言:txt
复制
    'text' => ['a','text']
代码语言:txt
复制
])->query()->getData();
代码语言:txt
复制
//打印结果
代码语言:txt
复制
print_r($data->all());
代码语言:txt
复制
/**
代码语言:txt
复制
 * 在线测试采集并查看采集结果:http://querylist.cc/querylist-test
 */

进阶

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

代码语言:txt
复制
<?php
代码语言:txt
复制
// 采集该页面[正文内容]中所有的图片
代码语言:txt
复制
$data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('.post_content img')->attrs('src');
代码语言:txt
复制
//打印结果
代码语言:txt
复制
print_r($data->all());
代码语言:txt
复制
// 采集该页面文章列表中所有[文章]的超链接和超链接文本内容
代码语言:txt
复制
$data = QueryList::get('http://cms.querylist.cc/google/list_1.html')->rules([
代码语言:txt
复制
    'link' => ['h2>a','href','',function($content){
代码语言:txt
复制
        //利用回调函数补全相对链接
代码语言:txt
复制
        $baseUrl = 'http://cms.querylist.cc';
代码语言:txt
复制
        return $baseUrl.$content;
代码语言:txt
复制
    }],
代码语言:txt
复制
    'text' => ['h2>a','text']
代码语言:txt
复制
])->range('.cate_list li')->query()->getData();
代码语言:txt
复制
//打印结果
代码语言:txt
复制
print_r($data->all());

全貌

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

代码语言:txt
复制
<?php
代码语言:txt
复制
/**
代码语言:txt
复制
 * 下面来完整的演示采集一篇文章页的文章标题、发布日期和文章内容并实现图片本地化
 */
代码语言:txt
复制
 //引入自动加载文件
代码语言:txt
复制
require 'vendor/autoload.php';
代码语言:txt
复制
use QL\QueryList;
代码语言:txt
复制
//需要采集的目标页面
代码语言:txt
复制
$page = 'http://cms.querylist.cc/news/566.html';
代码语言:txt
复制
//采集规则
代码语言:txt
复制
$reg = [
代码语言:txt
复制
    //采集文章标题
代码语言:txt
复制
    'title' => ['h1','text'],
代码语言:txt
复制
    //采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
代码语言:txt
复制
    'date' => ['.pt_info','text','-span -a',function($content){
代码语言:txt
复制
        //用回调函数进一步过滤出日期
代码语言:txt
复制
        $arr = explode(' ',$content);
代码语言:txt
复制
        return $arr[0];
代码语言:txt
复制
    }],
代码语言:txt
复制
    //采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
代码语言:txt
复制
    'content' => ['.post_content','html','a -.content_copyright -script']
代码语言:txt
复制
];
代码语言:txt
复制
$rang = '.content';
代码语言:txt
复制
$ql = QueryList::get($page)->rules($reg)->range($rang)->query();
代码语言:txt
复制
$data = $ql->getData(function($item){
代码语言:txt
复制
  //利用回调函数下载文章中的图片并替换图片路径为本地路径
代码语言:txt
复制
  //使用本例请确保当前目录下有image文件夹,并有写入权限
代码语言:txt
复制
  $content = QueryList::html($item['content']);
代码语言:txt
复制
  $content->find('img')->map(function($img){
代码语言:txt
复制
      $src = 'http://cms.querylist.cc'.$img->src;
代码语言:txt
复制
      $localSrc = 'image/'.md5($src).'.jpg';
代码语言:txt
复制
      $stream = file_get_contents($src);
代码语言:txt
复制
      file_put_contents($localSrc,$stream);
代码语言:txt
复制
      $img->attr('src',$localSrc);
代码语言:txt
复制
  });
代码语言:txt
复制
  $item['content'] = $content->find('')->html();
代码语言:txt
复制
  return $item;
代码语言:txt
复制
});
代码语言:txt
复制
//打印结果
代码语言:txt
复制
print_r($data->all());

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

undefined

代码语言:txt
复制
<?php
代码语言:txt
复制
require 'vendor/autoload.php';
代码语言:txt
复制
use QL\QueryList;
代码语言:txt
复制
$ql = QueryList::get('https://blog.eirds.cn/');
代码语言:txt
复制
//获取所有h2标签下的a标签的文本
代码语言:txt
复制
$data = $ql->find('h2>a')->texts();
代码语言:txt
复制
print_r($data->all());
代码语言:txt
复制
//获取所有<span>标签下文本
代码语言:txt
复制
$data = $ql->find('span')->texts();
代码语言:txt
复制
print_r($data->all());

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

undefined

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ph好用的采集类
  • 安装
  • 初探
  • 进阶
  • 全貌
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档