【问题标题】:Possibly incorrect spider/exporter example code in scrapy docsscrapy docs中可能不正确的spider/exporter示例代码
【发布时间】:2012-01-31 15:14:40
【问题描述】:

有人可以检查下面的代码是否正确吗? 代码位于 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

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    我认为这个问题应该在scrapy-users group 中提出。

    AFAIK,因为 v0.14 Scrapy 不支持在一个进程中使用多个蜘蛛 (related discussion),所以这段代码可以正常工作。多个蜘蛛的明显解决方法是使用spider 键制作exporters dict:

    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
    

    【讨论】:

    • 谢谢,很有启发性
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2019-08-08
    • 2021-03-04
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多