Я недавно запустил паука, который экспортировал пустой канал, хотя я не изменил настройку 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.py
, pipelines.py
и другими в каталоге my_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
не то же самое;это не относится к каналу в целом, только к пустым полям внутри отдельных элементов.Я посмотрел здесь и здесь , чтобы увидеть, могут ли эти двое повлиять друг на друга в любой момент, и я не вижу, как они могут.
Далее, если я войдуself.logger.debug(self.settings['FEED_STORE_EMPTY'])
изнутри моего паука, он показывает False
.
Тем не менее, если мой обход (scrapy crawl spam
) получает 500 по URL-адресу start_request
, паук закрывается после 2 попыток, и я 'м осталось с пустой подачей.Я не могу воспроизвести 500 по требованию, но у меня есть этот паук, запланированный ежечасно с целью раскрытия подобных проблем.Я не хочу пустой канал, потому что он будет иметь негативные последствия для моего конвейера данных, и я не чувствую, что мне нужно обрабатывать пустой канал вниз по течению, когда я просто смогу предотвратить его создание.
Я запускал этого паука 100 раз, и он работал, как и ожидалось.
Заранее благодарим за любые идеи, которые вы можете дать.