Feed 导出¶
在实现scraper时,最经常需要的功能之一是能够正确地存储被抓取的数据,这通常意味着用被抓取的数据(通常称为“导出提要”)生成一个“导出文件”,供其他系统使用。
Scrapy在提要导出中提供了开箱即用的功能,它允许您使用多种序列化格式和存储后端来生成带有所刮取项的提要。
序列化格式¶
为了序列化 爬取 的数据,提要导出使用 Item exporters . 开箱即用支持这些格式:
但是您也可以通过 FEED_EXPORTERS
设置。
JSON¶
价值
format
关键在FEEDS
设置:json
出口商:
JsonItemExporter
见 this warning 如果您使用的是大型提要的JSON。
杰森线¶
价值
format
关键在FEEDS
设置:jsonlines
CSV¶
价值
format
关键在FEEDS
设置:csv
出口商:
CsvItemExporter
指定要导出的列及其顺序的步骤使用
FEED_EXPORT_FIELDS
. 其他feed导出器也可以使用此选项,但对于csv很重要,因为与许多其他导出格式不同,csv使用固定头。
XML¶
价值
format
关键在FEEDS
设置:xml
出口商:
XmlItemExporter
泡菜¶
价值
format
关键在FEEDS
设置:pickle
出口商:
PickleItemExporter
元帅¶
价值
format
关键在FEEDS
设置:marshal
出口商:
MarshalItemExporter
储藏室¶
使用提要导出时,可以使用一个或多个定义存储提要的位置 URIs (通过 FEEDS
设置)。提要导出支持由URI方案定义的多个存储后端类型。
开箱支持的存储后端包括:
如果所需的外部库不可用,则某些存储后端可能不可用。例如,只有在 botocore 库已安装。
存储URI参数¶
存储URI还可以包含在创建源时被替换的参数。这些参数是:
%(time)s
-在创建源时被时间戳替换%(name)s
-替换为蜘蛛名称
任何其他命名参数都将被同名的spider属性替换。例如, %(site_id)s
将被替换为 spider.site_id
属性为正在创建源的时刻。
下面举例说明:
使用每个spider一个目录存储在ftp中:
ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json
使用每个spider一个目录存储在S3中:
s3://mybucket/scraping/feeds/%(name)s/%(time)s.json
注解
Spider arguments 成为爬行器属性,因此它们还可以用作存储URI参数。
存储后端¶
本地文件系统¶
源存储在本地文件系统中。
URI方案:
file
示例性URI:
file:///tmp/export.csv
所需外部库:无
请注意,对于本地文件系统存储(仅限),如果您指定类似 /tmp/export.csv
. 不过,这只在UNIX系统上工作。
FTP¶
这些提要存储在FTP服务器中。
URI方案:
ftp
示例性URI:
ftp://user:pass@ftp.example.com/path/to/export.csv
所需外部库:无
ftp支持两种不同的连接模式: active or passive .默认情况下,Scrapy使用被动连接模式。要使用活动连接模式,请设置 FEED_STORAGE_FTP_ACTIVE
设置为 True
.
此存储后端使用 delayed file delivery .
S3¶
源存储在 Amazon S3 .
URI方案:
s3
URI示例:
s3://mybucket/path/to/export.csv
s3://aws_key:aws_secret@mybucket/path/to/export.csv
所需的外部库: botocore >=1.4.87
AWS凭证可以作为用户/密码在URI中传递,也可以通过以下设置传递:
AWS_SESSION_TOKEN
(仅在以下情况下需要 temporary security credentials )
您还可以使用此设置为导出源定义自定义ACL和自定义终结点:
此存储后端使用 delayed file delivery .
谷歌云存储(GCS)¶
2.3 新版功能.
源存储在 Google Cloud Storage .
URI方案:
gs
URI示例:
gs://mybucket/path/to/export.csv
所需的外部库: google-cloud-storage .
有关身份验证的详细信息,请参阅 Google Cloud documentation .
你可以设置一个 项目标识 和 访问控制列表(ACL) 通过以下设置:
此存储后端使用 delayed file delivery .
标准输出¶
进料被写入 Scrapy 处理的标准输出。
URI方案:
stdout
示例性URI:
stdout:
所需外部库:无
延迟文件传递¶
如上所述,所述的一些存储后端使用延迟的文件传递。
这些存储后端不会将项上载到提要URI,因为这些项是被刮取的。相反,Scrapy将项目写入一个临时本地文件,只有当所有文件内容都被写入(即在爬网结束时),该文件才会上载到提要URI。
如果要在使用这些存储后端之一时提前开始项目传递,请使用 FEED_EXPORT_BATCH_ITEM_COUNT
将输出项拆分为多个文件,每个文件具有指定的最大项数。这样,一旦文件达到最大项数,该文件就被传递到提要URI,从而允许条目传递在爬网结束之前开始。
项目筛选¶
VERSION 新版功能.
属性可以对要允许特定提要使用的项目进行过滤操作。 item_classes
选项输入 feeds options 。只有指定类型的项目才会添加到提要。
这个 item_classes
选项由 ItemFilter
类的默认值,它是 item_filter
feed option 。
您可以通过实现以下方法创建您自己的自定义筛选类 ItemFilter
的方法 accepts
和拿走 feed_options
作为一种论据。
例如::
class MyCustomFilter:
def __init__(self, feed_options):
self.feed_options = feed_options
def accepts(self, item):
if "field1" in item and item["field1"] == "expected_data":
return True
return False
您可以将自定义筛选类分配给 item_filter
option of a feed 。看见 FEEDS
举个例子。
ItemFilter¶
后处理¶
VERSION 新版功能.
Scrapy提供了一个选项来激活插件,以便在将其导出到Feed存储之前对其进行后期处理。除了使用 builtin plugins ,您可以创建自己的 plugins 。
这些插件可以通过 postprocessing
馈送的选项。必须按照您希望处理提要的顺序向该选项传递一个后处理插件列表。这些插件可以声明为导入字符串,也可以使用插件的导入类声明。插件的参数可以通过提要选项传递。看见 feed options 举个例子。
内置插件¶
- class scrapy.extensions.postprocessing.GzipPlugin(file: BinaryIO, feed_options: Dict[str, Any])[源代码]¶
使用以下命令压缩接收的数据 gzip 。
已接受
feed_options
参数:gzip_compresslevel
gzip_mtime
gzip_filename
看见
gzip.GzipFile
有关参数的详细信息,请参阅。
- class scrapy.extensions.postprocessing.LZMAPlugin(file: BinaryIO, feed_options: Dict[str, Any])[源代码]¶
使用以下命令压缩接收的数据 lzma 。
已接受
feed_options
参数:lzma_format
lzma_check
lzma_preset
lzma_filters
注解
lzma_filters
不能在PyPy版本7.3.1及更早版本中使用。看见
lzma.LZMAFile
有关参数的详细信息,请参阅。
- class scrapy.extensions.postprocessing.Bz2Plugin(file: BinaryIO, feed_options: Dict[str, Any])[源代码]¶
使用以下命令压缩接收的数据 bz2 。
已接受
feed_options
参数:bz2_compresslevel
看见
bz2.BZ2File
有关参数的详细信息,请参阅。
自定义插件¶
每个插件都是一个必须实现以下方法的类:
- __init__(self, file, feed_options)¶
初始化插件。
- write(self, data)¶
Process and write data (
bytes
ormemoryview
) into the plugin's target file. It must return number of bytes written.
- close(self)¶
关闭目标文件对象。
要将参数传递给插件,请使用 feed options 。然后,您可以从 __init__
插件的方法。
设置¶
以下是用于配置源导出的设置:
FEEDS
(强制性)
FEEDS¶
2.1 新版功能.
违约: {{}}
一个字典,其中每个键都是一个feed URI(或 pathlib.Path
对象),每个值都是一个嵌套字典,其中包含特定提要的配置参数。
启用提要导出功能需要此设置。
见 存储后端 用于支持的URI方案。
例如::
{
'items.json': {
'format': 'json',
'encoding': 'utf8',
'store_empty': False,
'item_classes': [MyItemClass1, 'myproject.items.MyItemClass2'],
'fields': None,
'indent': 4,
'item_export_kwargs': {
'export_empty_fields': True,
},
},
'/home/user/documents/items.xml': {
'format': 'xml',
'fields': ['name', 'price'],
'item_filter': MyCustomFilter1,
'encoding': 'latin1',
'indent': 8,
},
pathlib.Path('items.csv.gz'): {
'format': 'csv',
'fields': ['price', 'name'],
'item_filter': 'myproject.filters.MyCustomFilter2',
'postprocessing': [MyPlugin1, 'scrapy.extensions.postprocessing.GzipPlugin'],
'gzip_compresslevel': 5,
},
}
以下是接受的键和设置的列表,如果没有为特定的源定义提供该键,则该设置用作回退值:
format
: serialization format .此设置是必需的,没有回退值。
batch_item_count
:回到FEED_EXPORT_BATCH_ITEM_COUNT
.2.3.0 新版功能.
encoding
:回到FEED_EXPORT_ENCODING
.fields
:回到FEED_EXPORT_FIELDS
.item_classes
:列表 item classes 去出口。如果未定义或为空,则导出所有项目。
VERSION 新版功能.
item_filter
:A filter class 到过滤要出口的项目。ItemFilter
是默认使用的。VERSION 新版功能.
indent
:回到FEED_EXPORT_INDENT
.item_export_kwargs
:dict
对应的关键字参数 item exporter class .2.4.0 新版功能.
overwrite
:如果文件已存在,是否覆盖该文件 (True
)或附加到其内容中 (False
)默认值取决于 storage backend :
本地文件系统:
False
FTP:
True
注解
某些FTP服务器可能不支持附加到文件(
APPE
FTP命令)。S3 :
True
(附加 is not supported )标准输出 :
False
(不支持覆盖)
2.4.0 新版功能.
store_empty
:回到FEED_STORE_EMPTY
.uri_params
:回到FEED_URI_PARAMS
.postprocessing
:列表 plugins 用于后处理。插件将按照传递的列表的顺序使用。
VERSION 新版功能.
FEED_EXPORT_ENCODING¶
违约: None
要用于源的编码。
如果未设置或设置为 None
(默认)它对除JSON输出外的所有内容都使用UTF-8,JSON输出使用安全的数字编码。 (\uXXXX
序列)出于历史原因。
使用 utf-8
如果您也想要为JSON使用UTF-8。
FEED_EXPORT_FIELDS¶
违约: None
要导出的字段列表,可选。例子: FEED_EXPORT_FIELDS = ["foo", "bar", "baz"]
.
使用feed_export_fields选项定义要导出的字段及其顺序。
当FEED_EXPORT_FIELDS为空或None(默认值)时,Scrapy使用中定义的字段 item objects 你的蜘蛛屈服了。
如果导出器需要一组固定的字段(这是 CSV export format)和feed_export_字段为空或无,然后scrapy尝试从导出的数据中推断字段名-当前它使用第一个项目中的字段名。
FEED_EXPORT_INDENT¶
违约: 0
用于在每个级别上缩进输出的空间量。如果 FEED_EXPORT_INDENT
是非负整数,则数组元素和对象成员将以该缩进级别进行漂亮打印。缩进量 0
(默认值)或负数,将把每个项目放到一个新行上。 None
选择最紧凑的表示形式。
当前仅由执行 JsonItemExporter
和 XmlItemExporter
,即当您要导出到 .json
或 .xml
.
FEED_STORE_EMPTY¶
违约: False
是否导出空源(即没有项的源)。
FEED_STORAGES¶
违约: {{}}
包含项目支持的其他提要存储后端的dict。键是URI方案,值是指向存储类的路径。
FEED_STORAGE_FTP_ACTIVE¶
违约: False
将源导出到FTP服务器时是否使用活动连接模式 (True
)或者使用被动连接模式 (False
,默认)。
有关ftp连接模式的信息,请参阅 What is the difference between active and passive FTP? .
FEED_STORAGE_S3_ACL¶
违约: ''
(空字符串)
包含项目导出到AmazonS3的源的自定义ACL的字符串。
有关可用值的完整列表,请访问 Canned ACL 亚马逊S3文档部分。
FEED_STORAGES_BASE¶
违约::
{
'': 'scrapy.extensions.feedexport.FileFeedStorage',
'file': 'scrapy.extensions.feedexport.FileFeedStorage',
'stdout': 'scrapy.extensions.feedexport.StdoutFeedStorage',
's3': 'scrapy.extensions.feedexport.S3FeedStorage',
'ftp': 'scrapy.extensions.feedexport.FTPFeedStorage',
}
包含由Scrapy支持的内置提要存储后端的dict。您可以通过分配 None
到他们的URI方案 FEED_STORAGES
. 例如,要禁用内置FTP存储后端(不替换),请将其放入 settings.py
::
FEED_STORAGES = {
'ftp': None,
}
FEED_EXPORTERS¶
违约: {{}}
包含项目支持的其他导出器的dict。键是序列化格式,值是指向 Item exporter 类。
FEED_EXPORTERS_BASE¶
违约::
{
'json': 'scrapy.exporters.JsonItemExporter',
'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
'jl': 'scrapy.exporters.JsonLinesItemExporter',
'csv': 'scrapy.exporters.CsvItemExporter',
'xml': 'scrapy.exporters.XmlItemExporter',
'marshal': 'scrapy.exporters.MarshalItemExporter',
'pickle': 'scrapy.exporters.PickleItemExporter',
}
包含由Scrapy支持的内置饲料导出器的dict。您可以通过分配 None
到其序列化格式 FEED_EXPORTERS
. 例如,要禁用内置的csv导出器(不替换),请将其放入 settings.py
::
FEED_EXPORTERS = {
'csv': None,
}
FEED_EXPORT_BATCH_ITEM_COUNT¶
2.3.0 新版功能.
违约: 0
如果分配了一个大于 0
,Scrapy生成多个输出文件,每个输出文件中最多存储指定数量的项。
生成多个输出文件时,必须在提要URI中至少使用以下一个占位符来指示如何生成不同的输出文件名:
%(batch_time)s
-在创建源时被时间戳替换(例如。2020-03-28T14-45-08.237134
)%(batch_id)d
-替换为批处理的从1开始的序列号。使用 printf-style string formatting 改变数字格式。例如,要根据需要引入前导零,使批次标识为5位数字,请使用
%(batch_id)05d
(例如)3
变成00003
,123
变成00123
)
例如,如果您的设置包括:
FEED_EXPORT_BATCH_ITEM_COUNT = 100
你的呢 crawl
命令行是:
scrapy crawl spidername -o "dirname/%(batch_id)d-filename%(batch_time)s.json"
上面的命令行可以生成如下目录树:
->projectname
-->dirname
--->1-filename2020-03-28T14-45-08.237134.json
--->2-filename2020-03-28T14-45-09.148903.json
--->3-filename2020-03-28T14-45-10.046092.json
其中第一个和第二个文件正好包含100个项目。最后一个包含100个项目或更少。
FEED_URI_PARAMS¶
违约: None
包含函数导入路径的字符串,用于设置要应用的参数 printf-style string formatting 到源URI。
函数签名应如下所示:
- scrapy.extensions.feedexport.uri_params(params, spider)¶
返回A
dict
要应用于提要URI的键值对 printf-style string formatting .- 参数
params (dict) -- 具体而言,默认键-值对:-
batch_id
: ID of the file batch. SeeFEED_EXPORT_BATCH_ITEM_COUNT
. IfFEED_EXPORT_BATCH_ITEM_COUNT
is0
,batch_id
is always1
. .. versionadded:: 2.3.0 -batch_time
: UTC date and time, in ISO format with:
replaced with `` -。看见 :setting:`FEED_EXPORT_BATCH_ITEM_COUNT` 。。。添加的版本::2.3.0- ``time
:batch_time
,并将微秒设置为0
。spider (scrapy.Spider) -- 源蜘蛛的饲料项目
例如,要包括 name
提要URI中的源爬行器的名称:
在项目的某个地方定义以下函数:
# myproject/utils.py def uri_params(params, spider): return {**params, 'spider_name': spider.name}
Point
FEED_URI_PARAMS
到您设置中的函数::# myproject/settings.py FEED_URI_PARAMS = 'myproject.utils.uri_params'
使用
%(spider_name)s
在你的源URI中:scrapy crawl <spider_name> -o "%(spider_name)s.jl"