Collection getData(Closure $callback = null)

优质
小牛编辑
134浏览
2023-12-01

获取采集结果数据,需要先执行query()方法。

  • 参数: $callback 可以通过这个回调函数进一步处理结果,替换内容、补全链接,下载图片等等;返回值不会修改原始data数据。 并且还可以在这个回调函数用使用QueyList进行嵌套无限级采集。

返回值

返回值为Laravel中Collection集合对象,通过它的all()方法可转为数组。

Collection文档:https://d.laravel-china.org/docs/5.4/collections

用法


采集所有图片链接,采集目标:

$html =<<<STR
    <div class="xx">
        <img data-src="/path/to/1.jpg" alt="">
    </div>
    <div class="xx">
        <img data-src="/path/to/2.jpg" alt="">
    </div>
    <div class="xx">
        <img data-src="/path/to/3.jpg" alt="">
    </div>
STR;

原始采集代码:

$data = QueryList::html($html)->rules(array(

        'image' => array('.xx>img','data-src')

    ))->query()->getData(function($item, $key){

        return $item;

    });

print_r($data->all());

/**
采集结果:
Array
(
    [0] => Array
        (
            [image] => /path/to/1.jpg
        )

    [1] => Array
        (
            [image] => /path/to/2.jpg
        )

    [2] => Array
        (
            [image] => /path/to/3.jpg
        )

)
**/

添加需求

输出的数组变成一维数组,改造采集代码:

$data = QueryList::html($html)->rules(array(

        'image' => array('.xx>img','data-src')

    ))->query()->getData(function($item){

        return $item['image'];

    });

print_r($data->all());
/**
采集结果:
Array
(
    [0] => /path/to/1.jpg
    [1] => /path/to/2.jpg
    [2] => /path/to/3.jpg
)
**/

继续添加需求

补全图片链接,改造采集代码:

$baseUrl = 'http://xxxx.com';

$data = QueryList::html($html)->rules(array(

        'image' => array('.xx>img','data-src')

    ))->query()->getData(function($item) use($baseUrl){

        return $baseUrl.$item['image'];

    });

print_r($data);
/**
采集结果:
Array
(
    [0] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/31-ogtfscnuovp.jpg
    [1] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/32-crqbawz5rsi.jpg
    [2] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/33-4adrvamzz11.jpg
)
**/

完整代码

<?php

require 'vendor/autoload.php';

use QL\QueryList;

$html =<<<STR
    <div class="xx">
        <img data-src="/path/to/1.jpg" alt="">
    </div>
    <div class="xx">
        <img data-src="/path/to/2.jpg" alt="">
    </div>
    <div class="xx">
        <img data-src="/path/to/3.jpg" alt="">
    </div>
STR;

$baseUrl = 'http://xxxx.com';

$data = QueryList::html($html)->rules(array(

        'image' => array('.xx>img','data-src')

    ))->query()->getData(function($item) use($baseUrl){

        return $baseUrl.$item['image'];

    });

print_r($data->all());