- Get Started
- 基础
- 进阶
- 技巧
- 插件推荐
- API
- Get Started
- 基础 API
- QueryList html($html)
- string getHtml($rel = true)
- QueryList rules(array $rules)
- QueryList range($selector)
- QueryList removeHead()
- QueryList query(Closure $callback = null)
- Collection getData(Closure $callback = null)
- Array queryData(Closure $callback = null)
- QueryList static getInstance()
- void destruct()
- void destructDocuments() 静态方法
- QueryList pipe(Closure $callback)
- 特殊 API
- 高级 API
- 默认插件
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
功能扩展
QueyList是完全模块化的设计,拥有强大的可扩展性。
使用bind()
方法绑定一个功能函数到QueryList对象,实现轻量级的功能扩展。bind()
方法的第一个参数是绑定的函数名,第二个参数是一个匿名的功能函数,这个功能函数的$this
对象指向的是当前的QueryList实例对象,所以在这个功能函数中可以直接通过$this
来调用QueryList的方法。
例子
注册一个自定义的http网络操作方法到QueryList对象。
采集代码: //采集开发者头条
$ql = QueryList::getInstance();
//注册一个myHttp方法到QueryList对象
$ql->bind('myHttp',function ($url){
$html = file_get_contents($url);
$this->setHtml($html);
return $this;
});
//然后就可以通过注册的名字来调用
$data = $ql->myHttp('https://toutiao.io')->find('h3 a')->texts();
print_r($data->all());
//或者这样用
$data = $ql->rules([
'title' => ['h3 a','text'],
'link' => ['h3 a','href']
])->myHttp('https://toutiao.io')->query()->getData();
print_r($data->all());
采集结果:Array
(
[0] => 用 500 行 Golang 代码实现高性能的消息回调中间件
[1] => 腾讯大神教你如何解决 Android 内存泄露
[2] => [译] 普通码农入门机器学习,必须掌握这些数据技能
[3] => 教你用 Carthage + RXSwift + MVVM + Moya + Router 写一个小说阅读 App
//...
)
Array
(
[0] => Array
(
[title] => 用 500 行 Golang 代码实现高性能的消息回调中间件
[link] => /k/u6hhfn
)
[1] => Array
(
[title] => 腾讯大神教你如何解决 Android 内存泄露
[link] => /k/abg526
)
[2] => Array
(
[title] => [译] 普通码农入门机器学习,必须掌握这些数据技能
[link] => /k/cnbt4o
)
[3] => Array
(
[title] => 教你用 Carthage + RXSwift + MVVM + Moya + Router 写一个小说阅读 App
[link] => /k/1aaumb
)
//....
)
自定义一个简单的图片下载功能。
采集代码: //采集并下载ZOL桌面壁纸
//扩展一个图片下载功能
//参数:$path 为图片本地保存路径
$ql = QueryList::bind('downloadImage',function ($path){
$data = $this->getData()->map(function ($item) use($path){
//获取图片
$img = file_get_contents($item['image']);
$localPath = $path.'/'.md5($img).'.jpg';
//保存图片到本地路径
file_put_contents($localPath,$img);
//data数组中新增一个自定义的本地路径字段
$item['local_path'] = $localPath;
return $item;
});
//更新data属性
$this->setData($data);
return $this;
});
$data = $ql->get('http://desk.zol.com.cn')->rules([
'image' => ['#newPicList img','src']
])->query()->downloadImage('img')->getData();
print_r($data->all());
采集结果:Array
(
[0] => Array
(
[image] => https://www.wenjiangs.com/wp-content/uploads/2021/docimg6/3-2zcro00ad3b.jpg
[local_path] => img/59561f7b8c122d529b9709fdc93283cd.jpg
)
[1] => Array
(
[image] => https://www.wenjiangs.com/wp-content/uploads/2021/docimg6/4-c234i3menyu.jpg
[local_path] => img/00bfaf54c930247815b6d906827600a9.jpg
)
[2] => Array
(
[image] => https://www.wenjiangs.com/wp-content/uploads/2021/docimg6/6-1nr4o5aqjnv.jpg
[local_path] => img/60ca7c8575da1f7746cb3e69918a7d68.jpg
)
// ...
)
如果你想扩展的功能比较复杂,你可以把你想扩展的功能独立成一个class,然后在bind里面调用。
QueryList::bind('myHttp',function(){
return new MyHttp($this);
})
一个bind
可以依赖另一个bind
。
$ql = QueryList::bind('myHttp',function(){
return new MyHttp($this);
});
$ql->bind('other',function(){
//使用上一个bind
$this->myHttp();
return $this;
})
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论