Scrapy экспортирует пустой канал с FEED_STORE_EMPTY == False (по умолчанию) - PullRequest
0 голосов
/ 16 октября 2018

Я недавно запустил паука, который экспортировал пустой канал, хотя я не изменил настройку 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 раз, и он работал, как и ожидалось.

Заранее благодарим за любые идеи, которые вы можете дать.

1 Ответ

0 голосов
/ 16 октября 2018

В случае, когда паук сканирует и не получает никаких элементов, похоже, что разница в поведении между установкой FEED_STORE_EMPTY на True против False заключается просто в том, что первый даст вам фид XML, который выглядит какэто

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

, тогда как последний просто даст вам пустой файл.

В ретроспективе это имеет смысл, потому что файл изначально создан, чтобы элементы могли быть вставлены в него во время сканирования.Я предполагаю, что предполагал, что этот пустой файл будет очищен / удален, если ни один элемент не был очищен.Имея это в виду, я могу изучить возможность включения этой функциональности в расширение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...