Scrapy 只输出最后一个增量更新的项

Scrapy 只输出最后一个增量更新的项,scrapy,Scrapy,有人能帮我吗?我已经搜索了两天了,运气不好 我有一个带有1个字段的项目作为其他项目的列表。spider工作正常,但在输出文件中,我得到了该项的所有行 例如,我需要将json打印为: {"id": "AAAA", "details": [ {"date" : "2013-01-10", type="A"}, {"date" : "2013-02-10", type="B"}, {"date" : "2013-03-10", type="C"}, {"date" : "2013-04-10"}, t

有人能帮我吗?我已经搜索了两天了,运气不好

我有一个带有1个字段的项目作为其他项目的列表。spider工作正常,但在输出文件中,我得到了该项的所有行

例如,我需要将json打印为:

{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"},
{"date" : "2013-03-10", type="C"},
{"date" : "2013-04-10"}, type="D"]}
但我得到:

{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"}]}

{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"}]}

{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"},
{"date" : "2013-03-10", type="C"}
]}

{"id": "AAAA", "details": [
{"date" : "2013-01-10", type="A"},
{"date" : "2013-02-10", type="B"},
{"date" : "2013-03-10", type="C"},
{"date" : "2013-04-10"}, type="D"]}
我使用函数更新我的父项:

def rePackIt(parent, item):
    if 'details' in parent:
        items = parent.get('details')
    else:
        items = []
    items.append(dict(item))
    parent['details'] = items

return parent
在解析函数中,我执行以下操作:

parent = ParentItem()
parent['id'] = self.param   # actually I parse a text file with many IDs
parent['details'] = []

yield FormRequest.from_response(response,
                                    formname='...',
                                    formdata={'...':'...', '...': parent['id'], 
                                              '...':''},
                                    meta = {'parent': parent, 'dont_merge_cookies': True},
                                    callback=self.parse1)


def parse1(self, response):
    parent = response.meta['parent']
    sel = HtmlXPathSelector(response)
    records = sel.select('//ul[@class="...."]')
    for record in records:
        item = DetailItem()
        item['type'] = record.select('child...')
        doc_link = record.select('child.../a/@href').extract()
        yield Request(doc_link,
                              callback=self.parse2,
                              method='GET',
                              headers={...},
                              meta={'dont_merge_cookies': True, 'cookiejar': cookieJar, 'item'  : item, 'parent' : parent}
                          )
  def parse2(self, response):
      item = response.meta['item']
      parent = response.meta['parent']
      sel = HtmlXPathSelector(response)
      # some other parsing code
      item['date'] = cell.select('span[1]/text()[1]').extact()
      rePackIt(parent, item)
      return parent

您试图废弃并作为json输出的页面具有以下结构

  • 主要项目1{一些信息}

    • 详细项目1

    • 详细项目2

  • 主要项目2

    • 详细项目1

    • 详细项目2

您将为每个报废的明细项目返回父对象。虽然您的意图是在父对象“完成”后仅返回一次。也就是说,您的家长已填写了所有详细的项目1..n。问题是您没有更好的方式来表示何时完成构建父项

处理此问题的一种方法是编写管道()。这听起来可能很复杂,但事实并非如此

基本上有三个步骤

open\u spider

创建窗体的全局对象

itemlist=[]

处理项目

if item is parent then
   add the item to the list 
if item is child then
   find the parentitem from the itemlist
   parentitem["detail"].add(childitem)
关闭\u蜘蛛网

将json序列化并写入所需文件。其中一个警告是,如果您正在废弃大量数据,所有被废弃的项都将保留在内存中,直到您使用此方法将它们写入文件,因为您将无法流式写入json项


让我知道这是否有效,或者您是否找到了更好的解决方案。

您能分享一些您的spider代码吗?特别是你如何实例化你的项目并设置这个日期列表?嗨,谢谢你的回复,我一直在等待gmail中的回复通知,但是没有收到。我现在将更新问题的主体。嗨,保罗。你看到密码了吗?我仍在等待你方的任何意见。谢谢你,非常感谢你提出这个解决方案。我回来工作了,我现在会检查一下,然后回来。祝你度过愉快的一天。嗨,我已经测试了这个解决方案,它工作得非常完美,非常感谢!!!我用几个案例对它进行了测试,我的输出JSON文件与它们应该的一样。还有一件事:self.itemlist=[]是我在init方法中编写的。再次感谢大家!!!对不起,我不能投票支持bcoz,因为我是新来的,我没有足够的分数。如果解决方案对你有效,你可以将其标记为答案。谢谢。哦,我错过了那个复选标记。。。现在它完成了。祝你度过愉快的一天和一周。