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

32|存储引擎:数据清洗与存储

你好,我是郑建勋。
爬虫项目的一个重要的环节就是把最终的数据持久化存储起来,数据可能会被存储到 MySQL、MongoDB、Kafka、Excel 等多种数据库、中间件或者是文件中。
要达到这个目的,我们很容易想到使用接口来实现模块间的解耦。我们还要解决数据的缓冲区问题。最后,由于爬虫的数据可能是多种多样的,如何对最终数据进行合理的抽象也是我们需要面临的问题。
这节课,我们将书写一个存储引擎,用它来处理数据的存储问题。

爬取结构化数据

之前我们爬取的案例比较简单,像是租房网站的信息等。但是实际情况下,我们的爬虫任务通常需要获取结构化的数据。例如一本书的信息就包含书名、价格、出版社、简介、评分等。为了生成结构化的数据,我以豆瓣图书为例书写我们的任务规则。
第一步,从首页中右侧获取热门标签的信息。
const regexpStr = `<a href="([^"]+)" class="tag">([^<]+)</a>`
func ParseTag(ctx *collect.Context) (collect.ParseResult, error) {
re := regexp.MustCompile(regexpStr)
matches := re.FindAllSubmatch(ctx.Body, -1)
result := collect.ParseResult{}
for _, m := range matches {
result.Requesrts = append(
result.Requesrts, &collect.Request{
Method: "GET",
Task: ctx.Req.Task,
Url: "<https://book.douban.com>" + string(m[1]),
Depth: ctx.Req.Depth + 1,
RuleName: "书籍列表",
})
}
return result, nil
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了如何通过编写存储引擎来解决爬虫项目中的数据持久化存储问题。作者以爬取豆瓣图书信息为例,详细介绍了任务规则的编写过程,并提出了对数据的抽象,将每条要存储的数据抽象为DataCell结构,并规定了其中的Key-Value对应关系。此外,文章还展示了如何实现存储引擎Storage,以及对存储引擎的验证。通过实际代码示例,深入浅出地介绍了存储引擎的设计与实现过程。在数据输出时,作者提出了一个问题:是否可以直接使用像Book这样的结构体,将数据直接传递给存储引擎来处理。这篇文章内容丰富,涵盖了存储引擎的设计、实现和验证,对于需要处理爬虫项目数据存储问题的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 出云
    按文中的写法,SqlStore.Flush() 方法不能处理同一个Batch中存在不同Task的DataCell的情况。
    2023-03-12归属地:广东
    1
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部