存储 #
Item用于存储需要导出的数据和一些其他辅助信息。 框架里内置的Item涵盖了主要文件、数据库、消息队列等存储方式。 pkg.Item是一个接口,不能直接使用。pkg.ItemUnimplemented实现了pkg.Item的所有方法。 如果Item需要实现pkg.Item,可以组合pkg.ItemUnimplemented。 如:
type ItemNone struct {
pkg.ItemUnimplemented
}
Item有一些通用方法:
-
Name() pkg.ItemName获取Item的具体类型,如pkg.ItemNone、pkg.ItemCsv、pkg.ItemJsonl、pkg.ItemMongo、pkg.ItemSqlite、pkg.ItemMysql、pkg.ItemKafka等,用于Item反序列化到具体Item实现。 -
SetReferrer(string)设置referrer,可以用于记录请求的来源,一般不需要自己设置,由ReferrerMiddleware自动设置。 -
Referrer() string获取referrer。 -
SetUniqueKey(string)设置uniqueKey,可以用于过滤和其他唯一用途。 -
UniqueKey() string获取uniqueKey。 -
SetId(any)设置id,主要用于保存数据时的主键,和uniqueKey的一个区别是,id可能是在Response中产生,请求时不一定能获得。 -
Id() any获取id。 -
SetData(any)设置data,这是要存储的完整数据。为了规范化,强制要求指针类型。存储到不同的目标时,data需要设置不同的格式。 -
Data() any获取data。 -
DataJson() string获取data json字符串。 -
SetFilesRequest([]pkg.Request)设置文件的请求。这是一个slice,可以下载多个文件。 -
FilesRequest() []pkg.Request获取文件的请求。 -
SetFiles([]pkg.File)设置文件。下载后的文件通过这个方法设置到Item中。 -
Files() []pkg.File获取文件。 -
SetImagesRequest([]pkg.Request)设置图片的请求。这是一个slice,可以下载多个图片。 -
ImagesRequest() []pkg.Request获取图片的请求。 -
SetImages([]pkg.Image)设置图片。下载后的图片通过这个方法设置到Item中。 -
Images() []pkg.Image获取图片。 -
内置Item实现:框架提供了一些内置的Item实现,如pkg.ItemNone、pkg.ItemCsv、pkg.ItemJsonl、pkg.ItemMongo、pkg.ItemSqlite、 pkg.ItemMysql、pkg.ItemKafka等。 您可以根据需要,返回Item,并开启相应的Pipeline。如:
err = s.YieldItem(ctx, items.NewItemMongo(s.collection, true). SetUniqueKey(extra.Keyword). SetId(extra.Keyword). SetData(&data))spider.WithOptions(pkg.WithMongoPipeline())- 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.ItemSqlite 保存到Sqlite中。
items.NewItemSqlite(table string, update bool)- table:sqlite table
- 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
- pkg.ItemNone 这个Item没有实现任何其他方法,主要用于调试。