Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

31|规则引擎:自定义爬虫处理规则

你好,我是郑建勋。
这一节课,我们重点来看看如何更合理地设置爬虫任务规则。之前,我们在查找租房信息时,已经实现了有一定扩展性的程序。通过在每一个请求中加入 ParseFunc 函数,可以实现灵活的请求规则。
// 单个请求
type Request struct {
unique string
Task *Task
Url string
Method string
Depth int
Priority int
ParseFunc func([]byte, *Request) ParseResult
}
但我们现在仍然面临几个问题:
一个爬虫任务会针对不同的网站有不同的处理规则,但现在的处理方式导致多个规则之间是割裂的,不便于统一管理。
我们在添加初始爬虫网站 URL 时,这些种子任务是在 main 函数中注入进去的,与任务的规则之间是割裂的。但是我们需要将初始爬虫 URL 与处理规则进行统一的管理。
当前的爬虫任务还是需要手动初始化才能运行,可配置化程度比较低。我们希望这些写好的静态任务在程序初始化时能够自动加载。而通过外部接口,或者只要在配置文件中指定一个任务名就能将任务调度起来。
更进一步,我们当前的任务和规则都是静态的,静态指的是代码需要提前写好,重新编译运行才能够在运行中被调用。我们能否动态地增加任务和任务的规则,让程序能够动态地解析我们的规则呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用规则引擎来自定义爬虫处理规则。作者首先提出了当前爬虫任务面临的问题,包括处理规则割裂、初始爬虫URL与处理规则管理不统一、爬虫任务需要手动初始化等。为了解决这些问题,文章介绍了静态规则引擎的设计和实现。静态规则引擎通过规则树和规则哈希表来管理任务的规则,实现了对性能要求高的爬虫任务。文章还通过示例代码演示了如何定义任务与规则、初始化任务与规则、启动任务以及加载任务的过程。通过静态规则引擎,可以实现任务与规则的统一管理,提高爬虫任务的可配置化程度和灵活性。 文章还介绍了动态规则引擎的设计和实现。相比静态规则引擎,动态规则引擎更加灵活,能够在程序运行过程中加载规则,降低了书写代码规则的门槛,甚至让业务人员也能书写简单的规则。通过使用Javascript虚拟机,文章演示了在Go语言中执行JS脚本的方法,并展示了如何借助otto库实现动态的规则引擎。动态规则引擎的实现过程包括构建动态规则模型TaskModle、书写动态爬虫规则、书写动态规则中的Go函数、初始化任务与规则以及启动并加载任务。通过动态规则引擎,可以更快速地应对灵活多变的检测需求,提高开发周期和灵活性。 总的来说,本文通过介绍静态规则引擎和动态规则引擎的设计和实现,为读者提供了一种更合理地设置爬虫任务规则的方法,并展示了如何在Go语言中实现灵活、高效的爬虫任务处理规则。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《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归属地:北京
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部