go-crawler的Item设计

102 阅读2分钟

Item用于存储需要导出的数据和一些其他辅助信息。
pkg.Item是一个接口,不能直接使用。pkg.ItemUnimplemented实现了pkg.Item的所有方法。 框架里内置的Item涵盖了主要文件、数据库、消息队列等存储方式。 如果Item需要实现pkg.Item,可以组合pkg.ItemUnimplemented。 如:

type ItemNone struct {  
pkg.ItemUnimplemented  
}  
  
  • Item有一些通用方法:
  • GetName() pkg.ItemName
    获取Item的具体类型,如pkg.ItemNone、pkg.ItemCsv、pkg.ItemJsonl、pkg.ItemMongo、pkg.ItemMysql、pkg.ItemKafka等,用于Item反序列化到具体Item实现。
  • SetReferrer(string) 设置referrer,可以用于记录请求的来源,一般不需要自己设置,由ReferrerMiddleware自动设置。
  • GetReferrer() string 获取referrer。
  • GetUniqueKey(string) 设置uniqueKey,可以用于过滤和其他唯一用途。
  • GetUniqueKey() string 获取uniqueKey。
  • SetId(any) 设置id,主要用于保存数据时的主键,和uniqueKey的一个区别是,id可能是在Response中产生,请求时不一定能获得。
  • GetId() any 获取id。
  • SetData(any) 设置data,这是要存储的完整数据。为了规范化,强制要求指针类型。存储到不同的目标时,data需要设置不同的格式。
  • GetData() any 获取data。
  • SetFilesRequest([]pkg.Request) 设置文件的请求。这是一个slice,可以下载多个文件。
  • GetFilesRequest() []pkg.Request 获取文件的请求。
  • SetFiles([]pkg.File) 设置文件。下载后的文件通过这个方法设置到Item中。
  • GetFiles() []pkg.File 获取文件。
  • SetImagesRequest([]pkg.Request) 设置图片的请求。这是一个slice,可以下载多个图片。
  • GetImagesRequest() []pkg.Request 获取图片的请求。
  • SetImages([]pkg.Image) 设置图片。下载后的图片通过这个方法设置到Item中。
  • GetImages() []pkg.Image 获取图片。
  • 内置Item实现:框架提供了一些内置的Item实现,如pkg.ItemNone、pkg.ItemCsv、pkg.ItemJsonl、pkg.ItemMongo、pkg.ItemMysql、pkg.ItemKafka等。
    您可以根据需要,返回Item,并开启相应的Pipeline。如:
err = s.YieldItem(ctx, items.NewItemMongo(s.collection, true).  
SetUniqueKey(extra.Keyword).  
SetId(extra.Keyword).  
SetData(&data))  
  
app.NewApp(NewSpider,  
pkg.WithMongoPipeline(),  
).Run()  
  
  • pkg.ItemNone 这个Item没有实现任何其他方法,主要用于调试。
  • items.NewItemNone()
  • pkg.ItemCsv 保存到csv中。
  • items.NewItemCsv(filename string)
  • filename 存储的文件名,不包括拓展名
  • pkg.ItemJsonl 保存到jsonl中。
  • items.NewItemJsonl(filename string)
  • filename 存储的文件名,不包括拓展名
  • pkg.ItemMongo 保存到mongo中。
  • items.NewItemMongo(collection string, update bool)
  • collection mongo collection
  • update 如果数据已存在mongo中,是否更新
  • pkg.ItemMysql 保存到mysql中。
  • items.NewItemMysql(table string, update bool)
  • table mysql table
  • update 如果数据已存在mongo中,是否更新
  • pkg.ItemKafka 保存到kafka中。
  • items.NewItemKafka(topic string)
  • topic kafka topic

项目地址:go-crawler