ThinkPHP8中使用QueryList
一、安装QueryList 二、基础采集示例 三、采集结果
一、安装QueryList
通过Composer安装最新版QueryList:
composer require jaeger/querylist
二、基础采集示例
引用QueryList;
use QL\QueryList;
public functioncrawl(){
//采集百度搜索结果列表的标题和链接:
// $data= QueryList::get('http://www.baidu.com/s?wd=QueryList')
// // 设置采集规则
// ->rules([
// 'title'=>array('h3','text'),
// 'link'=>array('h3>a','href')
// ])
// ->query()->getData();
// dd($data->all());
//采集「昵图网」所有图片地址
$img=QueryList::get('http://www.nipic.com')->find('img')->attrs('src');
dd($img);
}
由于PHP 8.1及以上版本的严格类型检查导致的兼容性问题,具体表现为GuzzleHttp的CookieJar类实现了IteratorAggregate接口,但其getIterator()方法以及count()的返回类型声明与接口不兼容,会导致报错,有以下解决方案供参考:
CookieJar文件路径:/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
1,降级PHP版本:
将PHP版本降级到8.0或以下可以暂时解决这个问题。
2,修改代码(临时解决方案):
在CookieJar类的count()和getIterator()方法上添加#[\ReturnTypeWillChange]属性来临时抑制这个通知。修改后的代码应该类似:
#[\ReturnTypeWillChange]
public functioncount()
{
return count($this->cookies);
}
#[\ReturnTypeWillChange]
public functiongetIterator()
{
return new \ArrayIterator(array_values($this->cookies));
}
3,更新依赖库(长期解决方案):
检查并更新GuzzleHttp库到最新版本,因为新版本可能已经修复了这个兼容性问题。
4,严格类型声明(长期解决方案):
修改方法签名以符合接口要求
public function getIterator(): \Traversable
{
return new \ArrayIterator($this->cookies);
}
三、采集结果
© 版权声明
文章版权归原作者所有,本站只做转载和学习以及开发者个人原创。声明:下载本站资源即同意用户协议,本站程序仅供内部学习研究软件设计思想和原理使用,学习研究后请自觉删除,请勿传播,因未及时删除所造成的任何后果责任自负。
THE END
暂无评论内容