Feed 导出

在实现scraper时,最经常需要的功能之一是能够正确地存储被抓取的数据,这通常意味着用被抓取的数据(通常称为“导出提要”)生成一个“导出文件”,供其他系统使用。

Scrapy在提要导出中提供了开箱即用的功能,它允许您使用多种序列化格式和存储后端来生成带有所刮取项的提要。

序列化格式

为了序列化 爬取 的数据,提要导出使用 Item exporters . 开箱即用支持这些格式:

但是您也可以通过 FEED_EXPORTERS 设置。

JSON

杰森线

CSV

  • 价值 format 关键在 FEEDS 设置: csv

  • 出口商: CsvItemExporter

  • 指定要导出的列及其顺序的步骤使用 FEED_EXPORT_FIELDS . 其他feed导出器也可以使用此选项,但对于csv很重要,因为与许多其他导出格式不同,csv使用固定头。

XML

泡菜

元帅

  • 价值 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中传递,也可以通过以下设置传递:

您还可以使用此设置为导出源定义自定义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

设置

以下是用于配置源导出的设置:

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'): {
        'format': 'csv',
        'fields': ['price', 'name'],
        'item_filter': 'myproject.filters.MyCustomFilter2',
    },
}

以下是接受的键和设置的列表,如果没有为特定的源定义提供该键,则该设置用作回退值:

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 选择最紧凑的表示形式。

当前仅由执行 JsonItemExporterXmlItemExporter ,即当您要导出到 .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 变成 00003123 变成 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. See FEED_EXPORT_BATCH_ITEM_COUNT. If FEED_EXPORT_BATCH_ITEM_COUNT is 0, batch_id is always 1. .. 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- ``timebatch_time ,并将微秒设置为 0

  • spider (scrapy.Spider) -- 源蜘蛛的饲料项目

例如,要包括 name 提要URI中的源爬行器的名称:

  1. 在项目的某个地方定义以下函数:

    # myproject/utils.py
    def uri_params(params, spider):
        return {**params, 'spider_name': spider.name}
    
  2. Point FEED_URI_PARAMS 到您设置中的函数::

    # myproject/settings.py
    FEED_URI_PARAMS = 'myproject.utils.uri_params'
    
  3. 使用 %(spider_name)s 在你的源URI中:

    scrapy crawl <spider_name> -o "%(spider_name)s.jl"