插件窝 干货文章 QueryList递归采集时,Range方法如何避免数据合并?

QueryList递归采集时,Range方法如何避免数据合并?

数据 content 采集 rules 394    来源:    2025-03-13

在使用 QueryList 进行递归采集时,range 方法用于指定采集的范围。如果你希望在递归采集时避免数据合并,可以通过以下方式来实现:

1. 使用 each 方法替代 range

each 方法可以逐个处理采集到的数据,而不是一次性合并所有数据。这样可以避免数据合并的问题。

use QL\QueryList;

$url = 'http://example.com';
$rules = [
    'title' => ['h1', 'text'],
    'content' => ['div.content', 'html']
];

$data = QueryList::get($url)->rules($rules)->query()->getData();

$data->each(function($item) {
    // 处理每个采集到的数据项
    print_r($item);
});

2. 使用 map 方法

map 方法可以对采集到的数据进行逐个处理,并且返回一个新的集合,避免数据合并。

use QL\QueryList;

$url = 'http://example.com';
$rules = [
    'title' => ['h1', 'text'],
    'content' => ['div.content', 'html']
];

$data = QueryList::get($url)->rules($rules)->query()->getData();

$processedData = $data->map(function($item) {
    // 对每个数据项进行处理
    return [
        'title' => $item['title'],
        'content' => $item['content']
    ];
});

print_r($processedData->all());

3. 使用 range 方法时手动处理数据

如果你仍然需要使用 range 方法,可以在递归采集时手动处理数据,避免数据合并。

use QL\QueryList;

function recursiveCollect($url, $rules, $range) {
    $data = QueryList::get($url)->rules($rules)->range($range)->query()->getData();

    $result = [];
    $data->each(function($item) use (&$result) {
        // 手动处理每个数据项
        $result[] = $item;
    });

    return $result;
}

$url = 'http://example.com';
$rules = [
    'title' => ['h1', 'text'],
    'content' => ['div.content', 'html']
];
$range = 'div.item';

$result = recursiveCollect($url, $rules, $range);
print_r($result);

4. 使用 reduce 方法

reduce 方法可以对采集到的数据进行逐个处理,并且可以自定义数据的合并方式。

use QL\QueryList;

$url = 'http://example.com';
$rules = [
    'title' => ['h1', 'text'],
    'content' => ['div.content', 'html']
];

$data = QueryList::get($url)->rules($rules)->query()->getData();

$processedData = $data->reduce(function($carry, $item) {
    // 自定义数据的合并方式
    $carry[] = [
        'title' => $item['title'],
        'content' => $item['content']
    ];
    return $carry;
}, []);

print_r($processedData);

总结

通过使用 eachmapreduce 等方法,你可以在递归采集时避免数据合并的问题。根据你的具体需求选择合适的方法来处理采集到的数据。