Laravel 使用 QueryList 轻松采集网页

说明

我们有时需要抓取一个网页的内容,但只需要特定部分的信息,通常会用正则来解决,这当然没有问题。正则是一个通用解决方案,但特定情况下,往往有更简单快 捷的方法。

QueryList是一个基于phpQuery的PHP通用列表采集类,得益于phpQuery,让使用QueryList几乎没有任何学习成本,只要会CSS3选择器就可以轻松使用QueryList了,它让PHP做采集像jQuery选择元素一样简单。

安装

QueryList运行需要PHP5.3+,使用 Composer 安装:

composer require jaeger/querylist

用例

先上例子,再来解释。以采集PHPHub教程区文章列表为例:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

class IndexController extends Controller
{
    public function list()
    {
        //待采集的目标页面,PHPHub教程区
        $page = 'https://laravel-china.org/categories/6';
        //采集规则
        $rules = array(
            //文章标题
            'title' => ['.media-heading a','text'],
            //文章链接
            'link' => ['.media-heading a','href'],
            //文章作者名
            'author' => ['.img-thumbnail','alt']
        );
        //列表选择器
        $rang = '.topic-list>li';
        //采集
        $data = \QL\QueryList::Query($page,$rules,$rang)->data;
        //查看采集结果
        print_r($data);
    }
}

采集结果:

Array
(
    [0] => Array
        (
            [title] => 好友动态的实现原理
            [link] => https://learnku.com/laravel/t/2750
            [author] => luo975974740
        )

    [1] => Array
        (
            [title] => 打造完美的 Ubuntu16.04 开发环境【持续更新】
            [link] => https://learnku.com/laravel/t/2723
            [author] => liuwantao
        )

    //省略........

     [19] => Array
        (
            [title] => [Laravel 5.3 新功能] 10. 全文搜索方案 Laravel Scout 介绍
            [link] => https://learnku.com/laravel/t/2673
            [author] => monkey
        )
)

接口说明

使用QueyList只需要编写规则库,然后把规则库传给QueryList的静态方法QueryQueryList就会自动按照规则库把内容全部采集回来了,而规则库是用jQuery选择器来编写的,所以使用QueryList的整个过程非常简单!

//接口解释
QueryList::Query(采集的目标页面,采集规则[,区域选择器][,输出编码][,输入编码][,是否移除头部])
//采集规则
$rules = array(
   '规则名' => array('jQuery选择器','要采集的属性'[,"标签过滤列表"][,"回调函数"]),
   '规则名2' => array('jQuery选择器','要采集的属性'[,"标签过滤列表"][,"回调函数"]),
    ..........
    [,"callback"=>"全局回调函数"]
);
//注:方括号括起来的参数可选

QueryList扩展

  • Request 网络操作扩展

    可以实现如携带cookie、伪造来路等任意复杂的网络请求。

  • Login 模拟登陆扩展

    可以实现模拟登陆然后采集。

  • Multi 多线程插件

    多线程(多进程)采集扩展。

  • DImage 图片下载扩展

    DImage扩展,可实现简单的图片下载需求。

扩展通过QueryList::run 方法运行,同时你可以花几分钟就能创建一个自己的QueryList扩展,这里就不深入讲解了。


QueryList GIT@OSC地址:http://git.oschina.net/jae/QueryList

QueryList GitHub地址:https://github.com/jae-jae/QueryList

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

QueryList指导文档:http://doc.querylist.cc/

本帖已被设为精华帖!
本帖由系统于 1年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 12
monkey

有点意思 :thumbsup::thumbsup:

3年前 评论

还是网页的东西用网页处理方便,用电脑写比较复杂,得用正则什么.

3年前 评论
叶落山城

这个我一直在用,还是比较方便的,不过还是有问题的,
最主要文档写的很是不清楚,很多重要的地方,文档都是简单的一个实例而过,甚至什么都没有。。。还得自己慢慢看源码来搞。。。。

3年前 评论

采集还是喜欢用 scrapy

3年前 评论

厉害了,保存一下

3年前 评论

问个问题 然后网页的内容是ajax动态加载进去的,是不是就不行了,

2年前 评论
Flex

这个我用了蛮久了 有两个bug 一个是post 携带cookie有点毛病 会出现明明发送了正确的但服务器还是认为未登录 另一个是内存泄漏很严重

1年前 评论

这个有bug

2个月前 评论
xoyu

绝对地址这种没必要做成插件吧。
本来想用,但是感觉太臃肿了。

2个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!