欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  神坛PHP

QueryList是一套简洁、优雅的PHP采集工具

程序员文章站 2022-01-31 19:32:02
...

namespace app\index\controller;

use QL\QueryList;

class Index

{

    public function index()

    {

       //采集某页面所有的图片

       $data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('img')->attrs('src');

       //打印结果

       print_r($data->all());

    }

}


元素操作

// 采集「昵图网」所有图片地址

QueryList::get('http://www.nipic.com')->find('img')->attrs('src');

// 采集百度搜索结果

$ql = QueryList::get('http://www.baidu.com/s?wd=QueryList');

$ql->find('title')->text(); // 获取网站标题

$ql->find('meta[name=keywords]')->content; // 获取网站头部关键词

$ql->find('h3>a')->texts(); //获取搜索结果标题列表

$ql->find('h3>a')->attrs('href'); //获取搜索结果链接列表

$ql->find('img')->src; //获取第一张图片的链接地址

$ql->find('img:eq(1)')->src; //获取第二张图片的链接地址

$ql->find('img')->eq(2)->src; //获取第三张图片的链接地址

// 遍历所有图片

$ql->find('img')->map(function($img){

    echo $img->alt;  //打印图片的alt属性

});

//更多用法

$ql->find('#head')->append('<div>追加内容</div>')->find('div')->htmls();

$ql->find('.two')->children('img')->attrs('alt'); //获取class为two元素下的所有img孩子节点

//遍历class为two元素下的所有孩子节点

$data = $ql->find('.two')->children()->map(function ($item){

    //用is判断节点类型

    if($item->is('a')){

        return $item->text();

    }elseif($item->is('img'))

    {

        return $item->alt;

    }

});

$ql->find('a')->attr('href', 'newVal')->removeClass('className')->html('newHtml')->...

$ql->find('div > p')->add('div > ul')->filter(':has(a)')->find('p:first')->nextAll()->andSelf()->...

$ql->find('div.old')->replaceWith( $ql->find('div.new')->clone())->appendTo('.trash')->prepend('Deleted')->...



列表采集


// 采集百度搜索结果列表的标题和链接:

$data = QueryList::get('http://www.baidu.com/s?wd=QueryList')

    // 设置采集规则

    ->rules([ 

        'title'=>array('h3','text'),

        'link'=>array('h3>a','href')

    ])

    ->query()->getData();

print_r($data->all());



编码转换

// 输出编码:UTF-8,输入编码:GB2312

QueryList::get('https://top.etao.com')->encoding('UTF-8','GB2312')->find('a')->texts();

// 输出编码:UTF-8,输入编码:自动识别

QueryList::get('https://top.etao.com')->encoding('UTF-8')->find('a')->texts();



HTTP网络操作


// 携带cookie登录新浪微博

//采集新浪微博需要登录才能访问的页面

$ql = QueryList::get('http://weibo.com','param1=testvalue & params2=somevalue',[

    'headers' => [

        //填写从浏览器获取到的cookie

        'Cookie' => 'SINAGLOBAL=546064; wb_cmtLike_2112031=1; wvr=6;....'

    ]

]);

//echo $ql->getHtml();

echo $ql->find('title')->text();

//输出: 我的首页 微博-随时随地发现新鲜事

//使用Http代理

$urlParams = ['param1' => 'testvalue','params2' => 'somevalue'];

$opts = [

    // 设置http代理

    'proxy' => 'http://222.141.11.17:8118',

    //设置超时时间,单位:秒

    'timeout' => 30,

     // 伪造http头

    'headers' => [

        'Referer' => 'https://querylist.cc/',

        'User-Agent' => 'testing/1.0',

        'Accept'     => 'application/json',

        'X-Foo'      => ['Bar', 'Baz'],

        'Cookie'    => 'abc=111;xxx=222'

    ]

];

$ql->get('http://httpbin.org/get',$urlParams,$opts);

// echo $ql->getHtml();



多线程采集

$ql = QueryList::use(CurlMulti::class);

$ql->curlMulti([

    'https://github.com/trending/php',

    'https://github.com/trending/go',

    //.....more urls

])

 // 每个任务成功完成调用此回调

 ->success(function (QueryList $ql,CurlMulti $curl,$r){

    echo "Current url:{$r['info']['url']} \r\n";

    $data = $ql->find('h3 a')->texts();

    print_r($data->all());

})

 // 每个任务失败回调

->error(function ($errorInfo,CurlMulti $curl){

    echo "Current url:{$errorInfo['info']['url']} \r\n";

    print_r($errorInfo['error']);

})

->start([

    // 最大并发数

    'maxThread' => 10,

    // 错误重试次数

    'maxTry' => 3,