如何合并来自不同网址的具有相同标识符的项目

时间:2016-12-15 10:19:56

标签: scrapy

我目前正在从Excel文档中抓取多个产品网站。

该文件看起来基本上是这样的:

ID    URL1       URL2       URL3
01   abc.com/1   def.com/1  ghi.com/1
02   abc.com/2   def.com/2  ghi.com/2
03   abc.com/3   def.com/3  ghi.com/3 

我的蜘蛛现在获取ID和URL,并且由于站点不同,会向相应的parse - 函数发出请求,并将ID传递给每个函数。

现在的问题是我的csv-output多次列出每个ID,如下所示:

ID    PriceURL1    PriceURL2    PriceURL3
01    xx.xx
01                 xx.xx         
01                              xx.xx
02    xx.xx
02                              xx.xx
...

有没有办法合并这些项目,以便每个ID都具有从所有不同parse - 函数收集的价格?

到目前为止,我认为我的选择是:

  1. 实施抓取订单,以便蜘蛛首先抓取URL1,第二次抓取URL2,依此类推,在每个parse_urlX - 函数中产生一个请求,但我不知道这是否真的是一个优雅和资源 - 友好的方式,因为我每次都必须阅读文档中的网址。
  2. 按原样爬行,并在蜘蛛完成抓取后合并输出-csv文件中的已删除项目。
  3. 我认为可能是最好的方法,使用项目管道,以便将ID添加到集合中,然后检查当前已删除的ID是否已被删除,如果是,则将当前价格添加到项目。
  4. 我试过3.但直到现在,我无法弄清楚如何访问以前被抓取的项目并更新它们。

    实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

在我看来,最好的方法是事后处理这些项目。项目管道不是为了保存项目和合并项目而设计的,您可以过滤掉但不能以优雅的方式合并它们。

汇总输出非常简单:

import json
from collections import defaultdict

groups = defaultdict(list)

for line in open("items.jl"):
    item = json.loads(line)
    key = get_key(item)  # a function that returns a key for an item
    groups[key].append(item)

for items in groups.values():
    merged = merge_items(items)  # a function that returns a single item
    # store the merged item somewhere.
    ...

如果您的数据足够大且不适合记忆,我建议发布一个新问题,您将获得大量答案。