Scrapy导出带有FEED_STORE_EMPTY == False的空Feed(默认)

时间:2018-10-15 21:22:13

标签: python scrapy

我最近运行了一个蜘蛛,即使我没有更改FEED_STORE_EMPTY设置(默认为False),该蜘蛛也导出了一个空的提要。这是我的故事。

我的蜘蛛在某种程度上看起来像这样。它的提取和解析工作符合预期,未显示。

import scrapy
from scrapy.utils.project import get_project_settings
from my_project.spiders import MySpider
from my_project.items import MyItem


class SpamSpider(MySpider):
    name = 'spam'
    feed_format = 'xml'
    proj_xml_path = get_project_settings()['OUTPUT_XML_PATH']

    custom_settings = {
        'FEED_URI' : proj_xml_path+'\%(name)s.xml',
        'FEED_FORMAT': feed_format,
    }

我的settings.py包含以下相关行:

# When FEED_FORMAT is <key>, use <value> as exporter
FEED_EXPORTERS = {
    'xml' : 'my_project.exporters.XmlMyItemExporter'
}

# Output path
OUTPUT_XML_PATH = '\\\\this\path\works'

我在exporters.py中定义了一个自定义导出器。它与settings.pypipelines.pymy_project目录中的其他文件并存。它非常简单,其主要目的是为XML节点提供自定义名称。

from scrapy.exporters import XmlItemExporter

class XmlMyItemExporter(XmlItemExporter):

    def __init__(self, file, **kwargs):
        super().__init__(file, item_element='my_item', root_element='my_items', export_empty_fields=True, indent=2)

我无处可更改FEED_STORE_EMPTY,这允许导出空的提要。 kwarg export_empty_fields不相同;它不适用于整个Feed,仅适用于单个项目中的空白字段。我查看了herehere,看看它们是否在任何时候都可以相互影响,而我看不出它们会如何相互影响。

此外,如果我从蜘蛛网中登录self.logger.debug(self.settings['FEED_STORE_EMPTY']),则会显示False

尽管如此,如果我的抓取(scrapy crawl spam)在start_request网址上获得了500,那么蜘蛛网会在两次重试后关闭,而我的饲料却空了。我不能真正按需复制500,但是我每小时安排一次蜘蛛以发现此类问题。我不希望有一个空的提要,因为它会对我的数据管道造成负面影响,而且我不应该在应该能够阻止它创建时就不必在下游处理一个空的提要。 >

我已经另外运行过100次此蜘蛛,并且执行效果达到预期。

提前感谢您可以提供的任何见解。

1 个答案:

答案 0 :(得分:0)

在蜘蛛没有抓取任何物品的情况下,似乎将FEED_STORE_EMPTY设置为TrueFalse之间的行为差​​异仅仅是前者会给您看起来像这样的xml feed

<?xml version="1.0" encoding="utf-8"?>
<my_items>
</my_items>

而后者只会给您一个空文件。

回想起来,这是有道理的,因为文件是最初创建的,因此可以在爬网期间将项目推入到文件中。我想我当时假设如果没有任何项目被删除,则将清除/删除此空文件。考虑到这一点,我可以探索将功能添加到扩展中的可能性。