Collection getData(Closure $callback = null)


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

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

返回值

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

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


用法


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

  1. $html =<<<STR
  2. <div class="xx">
  3. <img data-src="/path/to/1.jpg" alt="">
  4. </div>
  5. <div class="xx">
  6. <img data-src="/path/to/2.jpg" alt="">
  7. </div>
  8. <div class="xx">
  9. <img data-src="/path/to/3.jpg" alt="">
  10. </div>
  11. STR;

原始采集代码:

  1. $data = QueryList::html($html)->rules(array(
  2. 'image' => array('.xx>img','data-src')
  3. ))->query()->getData(function($item){
  4. return $item;
  5. });
  6. print_r($data->all());
  7. /**
  8. 采集结果:
  9. Array
  10. (
  11. [0] => Array
  12. (
  13. [image] => /path/to/1.jpg
  14. )
  15. [1] => Array
  16. (
  17. [image] => /path/to/2.jpg
  18. )
  19. [2] => Array
  20. (
  21. [image] => /path/to/3.jpg
  22. )
  23. )
  24. **/

添加需求

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

  1. $data = QueryList::html($html)->rules(array(
  2. 'image' => array('.xx>img','data-src')
  3. ))->query()->getData(function($item){
  4. return $item['image'];
  5. });
  6. print_r($data->all());
  7. /**
  8. 采集结果:
  9. Array
  10. (
  11. [0] => /path/to/1.jpg
  12. [1] => /path/to/2.jpg
  13. [2] => /path/to/3.jpg
  14. )
  15. **/

继续添加需求

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

  1. $baseUrl = 'http://xxxx.com';
  2. $data = QueryList::html($html)->rules(array(
  3. 'image' => array('.xx>img','data-src')
  4. ))->query()->getData(function($item) use($baseUrl){
  5. return $baseUrl.$item['image'];
  6. });
  7. print_r($data);
  8. /**
  9. 采集结果:
  10. Array
  11. (
  12. [0] => http://xxxx.com/path/to/1.jpg
  13. [1] => http://xxxx.com/path/to/2.jpg
  14. [2] => http://xxxx.com/path/to/3.jpg
  15. )
  16. **/

完整代码

  1. <?php
  2. require 'vendor/autoload.php';
  3. use QL\QueryList;
  4. $html =<<<STR
  5. <div class="xx">
  6. <img data-src="/path/to/1.jpg" alt="">
  7. </div>
  8. <div class="xx">
  9. <img data-src="/path/to/2.jpg" alt="">
  10. </div>
  11. <div class="xx">
  12. <img data-src="/path/to/3.jpg" alt="">
  13. </div>
  14. STR;
  15. $baseUrl = 'http://xxxx.com';
  16. $data = QueryList::html($html)->rules(array(
  17. 'image' => array('.xx>img','data-src')
  18. ))->query()->getData(function($item) use($baseUrl){
  19. return $baseUrl.$item['image'];
  20. });
  21. print_r($data->all());