Возможно неправильный пример кода паука / экспортера в документах scrapy - PullRequest
0 голосов
/ 31 января 2012

Может ли кто-нибудь проверить правильность приведенного ниже кода?Код найден на http://readthedocs.org/docs/scrapy/en/0.14/topics/exporters.html

Я считаю, что это неверно, потому что:

  • Класс отслеживает несколько одновременно открытых файлов для нескольких пауков, однако:
  • Экспортер (который зависит от файла) перезаписывается при каждом открытии нового паука.

Спасибо за любую помощь.

class XmlExportPipeline(object):

    def __init__(self):
        dispatcher.connect(self.spider_opened, signals.spider_opened)
        dispatcher.connect(self.spider_closed, signals.spider_closed)
        self.files = {}

    def spider_opened(self, spider):
        file = open('%s_products.xml' % spider.name, 'w+b')
        self.files[spider] = file
        self.exporter = XmlItemExporter(file)
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        file = self.files.pop(spider)
        file.close()

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

1 Ответ

1 голос
/ 31 января 2012

Я думаю, что этот вопрос следует задать в группе пользователей scrapy .

AFAIK, поскольку v0.14 Scrapy не поддерживает несколько пауков в одном процессе ( соответствующее обсуждение ), поэтому этот код будет работать нормально.И очевидное решение для нескольких пауков - сделать exporters диктовку с помощью spider ключей:

class XmlExportPipeline(object):

    def __init__(self):
        dispatcher.connect(self.spider_opened, signals.spider_opened)
        dispatcher.connect(self.spider_closed, signals.spider_closed)
        self.files = {}
        self.exporters = {}

    def spider_opened(self, spider):
        file = open('%s_products.xml' % spider.name, 'w+b')
        self.files[spider] = file
        self.exporters[spider] = XmlItemExporter(file)
        self.exporters[spider].start_exporting()

    def spider_closed(self, spider):
        self.exporters[spider].finish_exporting()
        file = self.files.pop(spider)
        file.close()

    def process_item(self, item, spider):
        self.exporters[spider].export_item(item)
        return item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...