2016-12-15 69 views
1

我目前从Excel文档中爬行多个产品网站。如何从不同的URL合并具有相同标识符的项目

该文件基本上是这样的:

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 -function的请求,并传递ID到每个功能。

现在的问题是,我的CSV输出列出每个ID多次,像这样:

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

有没有办法合并的项目,让每个ID具有价格从所有不同的聚集parse -functions?

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

  1. 实现一个刮秩序,让蜘蛛抓取URL1第一,第二URL2等,产生在每个parse_urlX功能全的要求,但我不不知道这是否真的是一种优雅和资源友好的方式,因为我每次都必须从文档中读取URL。
  2. 抓取它就像它一样,并在蜘蛛抓取完成后将输出的csv文件中的抓取的项目合并。
  3. 我认为可能是最好的方法,使用物品管道,以便它将ID添加到一个集合中,随后检查当前已刮取的ID是否已被刮取,如果是,则将当前价格添加到物品。

我试过3.但直到现在,我无法弄清楚如何访问以前刮过的物品并更新它们。

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

回答

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. 
    ... 

如果数据足够大,不适合的内存,我建议发布一个新的问题,你会得到很多答案。

+0

谢谢,这对我有很大的帮助。 – rongon

相关问题