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