31|规则引擎:自定义爬虫处理规则
郑建勋
你好,我是郑建勋。
这一节课,我们重点来看看如何更合理地设置爬虫任务规则。之前,我们在查找租房信息时,已经实现了有一定扩展性的程序。通过在每一个请求中加入 ParseFunc 函数,可以实现灵活的请求规则。
但我们现在仍然面临几个问题:
一个爬虫任务会针对不同的网站有不同的处理规则,但现在的处理方式导致多个规则之间是割裂的,不便于统一管理。
我们在添加初始爬虫网站 URL 时,这些种子任务是在 main 函数中注入进去的,与任务的规则之间是割裂的。但是我们需要将初始爬虫 URL 与处理规则进行统一的管理。
当前的爬虫任务还是需要手动初始化才能运行,可配置化程度比较低。我们希望这些写好的静态任务在程序初始化时能够自动加载。而通过外部接口,或者只要在配置文件中指定一个任务名就能将任务调度起来。
更进一步,我们当前的任务和规则都是静态的,静态指的是代码需要提前写好,重新编译运行才能够在运行中被调用。我们能否动态地增加任务和任务的规则,让程序能够动态地解析我们的规则呢?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何使用规则引擎来自定义爬虫处理规则。作者首先提出了当前爬虫任务面临的问题,包括处理规则割裂、初始爬虫URL与处理规则管理不统一、爬虫任务需要手动初始化等。为了解决这些问题,文章介绍了静态规则引擎的设计和实现。静态规则引擎通过规则树和规则哈希表来管理任务的规则,实现了对性能要求高的爬虫任务。文章还通过示例代码演示了如何定义任务与规则、初始化任务与规则、启动任务以及加载任务的过程。通过静态规则引擎,可以实现任务与规则的统一管理,提高爬虫任务的可配置化程度和灵活性。 文章还介绍了动态规则引擎的设计和实现。相比静态规则引擎,动态规则引擎更加灵活,能够在程序运行过程中加载规则,降低了书写代码规则的门槛,甚至让业务人员也能书写简单的规则。通过使用Javascript虚拟机,文章演示了在Go语言中执行JS脚本的方法,并展示了如何借助otto库实现动态的规则引擎。动态规则引擎的实现过程包括构建动态规则模型TaskModle、书写动态爬虫规则、书写动态规则中的Go函数、初始化任务与规则以及启动并加载任务。通过动态规则引擎,可以更快速地应对灵活多变的检测需求,提高开发周期和灵活性。 总的来说,本文通过介绍静态规则引擎和动态规则引擎的设计和实现,为读者提供了一种更合理地设置爬虫任务规则的方法,并展示了如何在Go语言中实现灵活、高效的爬虫任务处理规则。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
《Go 进阶 · 分布式爬虫实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- Realm课程渐入佳境了,知识越来越有趣味了。老师,有时间可以把每节课的思考题答疑下,那就更好了。 思考题: 猜测是用AST抽象语法树+反射,解析js,转成Golang语法。 疑问: ``` type CrawlerStore struct { list []*collect.Task hash map[string]*collect.Task } ``` 这个list的设计是用于做什么?好像程序中没有提到。
作者回复: 之前写代码时,考虑可以用于任务的优先级排序等功能
2022-12-20归属地:浙江 - 翡翠虎设计一个这样的引擎有什么好处?如果把xpath规则或者正则放到数据库,运行的时候随着任务传递给程序,程序按几个预设配置处理,会不会更好?
作者回复: 每一个具体的任务的过程都可能有很多个阶段,是比较复杂的,每个阶段还有联系。不能简单的用文本放在数据库中
2022-12-20归属地:广西 - 一打七不明白为什么是动态的?看着还是写死的代码2024-01-10归属地:北京
收起评论