2016-12-15 8 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 

私のクモは今のサイトが異なるため、対応するparse -functionに要求を生成し、それぞれにIDを渡し、IDとURLを取り、関数。

問題は今である私のCSV出力リストこのような各IDを複数回、:

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

アイテムをマージする方法は、各IDを持つように価格は全て異なるから集められた、ありますparse -functions?

これまでのところ、私は私のオプションがあることだと思う:クモは、各parse_urlX -functionで要求を得、最初、URL2二などURL1をクロールするように、掻き取り順序を実装

  1. が、私ドン私は毎回その文書から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

関連する問題