这篇我们来实现将我们爬取到的数据保存到 elasticsearch 中以供查询。
其实实际生产中的做法往往是将数据保存到 mysql 这样的传统数据库中,然后 elasticsearch 只是定期从这些数据库中同步数据,本文只是实验,故没有采取这种做法。
项目架构
还记得我们前面的项目架构图吗,原来的我就不放上来了,我们现在补充一下左边部分(好吧,我承认我把原图给弄丢了):
实现 ItemSaver
我们新建一个 persit 目录,并创建 itemsaver 文件:
1 | package persist |
ItemSaver
会创建一个 channel 并作为返回值,然后会启动一个 goroutine,不断从 channel 中获取数据并保存到 elasticsearch 中。
启动爬虫的时候,会将 ItemSaver
返回的 channel 传递给 Engine
:
1 | e := engine.ConcurrentEngine{ |
当 Engine
中得到 Items
数据的时候,会将它们发送到 ItemChan
中:
1 | for _, item := range result.Items { |
总结
本文基于前面构建的爬虫框架,将爬取到的数据保存到 elasticsearch 中,代码还是比较直观的,但是 ItemSaver
中硬编码了 elasticsearch 的一些代码,这里可以抽象一下,使得我们的 ItemSaver
可以支持多个数据源。