2011-03-15 11 views
1

私はpythonでクローラフレームワーク「scrapy」を使用して、私はこれを行うためにfile.TheコードにJSON形式で私の項目を保存するためにpipelines.pyファイルを使用するには 輸入JSONクローラーは2回実行すると重複を生成しますか?

class AYpiPipeline(object): 
def __init__(self): 
    self.file = open("a11ypi_dict.json","ab+") 


# this method is called to process an item after it has been scraped. 
def process_item(self, item, spider): 
    d = {}  
    i = 0 
# Here we are iterating over the scraped items and creating a dictionary of dictionaries. 
try: 
    while i<len(item["foruri"]): 
     d.setdefault(item["foruri"][i],{}).setdefault(item["rec"][i],{})[item["foruri_id"][i]] = item['thisurl'] + ":" + item["thisid"][i] 
    i+=1 
except IndexError: 
    print "Index out of range" 
    # Writing it to a file 
    json.dump(d,self.file) 
return item 

以下に示します。問題は、クローラを2回実行してファイルをコピーしたときに、重複したアイテムを取得したときです。最初にファイルから読み込み、書き込まれる新しいデータとデータを一致させることでデータを保護しましたが、ファイルがjson形式であるため、json.loads()関数でデコードしましたが、動作しません。

これを行う方法を提案してください。

注:私は

+0

私は、解決策は、スクリプトの複数のインスタンスが同時に実行されないようにすることだと思います。このためにファイルロックを使用することができます(スクリプト内または外部で、flockのようなユーティリティを使用します)。 複数のクローラインスタンスの理由は何ですか? – Gregory

答えて

1

二回ファイルに同じデータを書き込む必要があるリンクの異なるセットをクロールするが、同じSTART_URLで二回クローラを実行しているかもしれないので、私は「追記」モードでファイルを開く必要があることに注意してくださいカスタムミドルウェア(例:this)を使用して重複を除外で​​きます。しかし、あなたのスパイダーでこれを実際に使用するには、フィルタに重複を識別できるようにアイテムにIDを割り当てる方法と、スパイダーラン間でvisited idのセットを保持する方法の2つが必要です。 2つ目は簡単です。棚のようなピノニックを使用することもできます。また、最近普及している多くのキーバリューストアを使用することもできます。最初の部分は難しくなりますが、解決しようとしている問題に依存します。

関連する問題