scrapy管道导出器对象未实例化

时间:2017-12-27 06:41:09

标签: python json scrapy

我正在使用scrapy来解析包含链接的表并将其保存在json中。表中的链接包含其他详细信息,它们将被提取并存储到另一个json中。 (以下示例:https://docs.scrapy.org/en/latest/topics/exporters.html

为了实现这一点,我使用管道检查项目类型并将结果存储在适当的json中。但是,我陷入了一些奇怪的错误。请参考以下内容:

// BuildUtils is my helper class to get current flavor check easily.
if (BuildUtils.isInternational()) {
      getAppDatabase().UserDao().getAllUserGroupByName();
}

错误:

from scrapy import signals
from scrapy.exporters import JsonItemExporter
from for_icu import items

class ListPipeline(object):
def __init__(self):
    self.files = {}

@classmethod
def from_crawler(cls, crawler):
    pipeline = cls()
    crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
    crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
    return pipeline

def spider_opened(self, spider):
    print("spider_opened")
    file_table = open('%s_table.json' % spider.name, 'w+b')
    self.files[spider].append(file_table)
    self.exporter1 = JsonItemExporter(file_table)
    self.exporter1.start_exporting()
    file_detail = open('%s_detail.json' % spider.name, 'w+b')
    self.files[spider].append(file_detail)
    self.exporter2 = JsonItemExporter(file_detail)
    self.exporter2.start_exporting()

def spider_closed(self, spider):
    print("spider_closed")
    self.exporter1.finish_exporting()
    self.exporter2.finish_exporting()
    for file in self.files.pop(spider):
        file.close()

def process_item(self, item, spider):
    print("process_item")
    if isinstance(item, items.UniListItem):
        self.exporter1.export_item(item)
        return item
    elif isinstance(item, items.UniDetail):
        self.exporter22.export_item(item)
        return item

请让我知道我在这里失踪了...在过去的几个小时内被困在这里...

1 个答案:

答案 0 :(得分:0)

我无法让导出器工作,因此我使用简单的文件编写器来完成任务:

class ListPipeline(object):
unilist = []
unidetail = []

def close_spider(self, spider):
    print("spider_closed")
    file_table = open('%s_table.json' % spider.name, 'w')
    line = json.dumps(self.unilist)
    file_table.write(line)
    file_table.close()
    file_detail = open('%s_detail.json' % spider.name, 'w')
    line = json.dumps(self.unidetail)
    file_detail.write(line)
    file_detail.close()
    self.unilist.clear()
    self.unidetail.clear()

def process_item(self, item, spider):
    print("process_item")
    if isinstance(item, items.UniListItem):
        self.unilist.append(dict((item)))
        return item
    elif isinstance(item, items.UniDetail):
        self.unidetail.append(dict((item)))
        return item

这使我实现了我想要的,但如果可以使用内置出口商会更好。如果有人知道如何使其工作,请更新。