2017-08-02 7 views
1

私はいくつかのアイテムを正常に生成しているスクラピースパイダーを開発しています。これらの項目は、pymysqlを使用してデータベースに挿入する必要があります。データはリレーショナルなので、すべての項目に対して、私はいくつかの挿入ステートメントを実行する必要があります。 挿入するたびにconnection.commit()に電話して、発生したエラーがデータベース内で一貫性のないエントリにならないようにします。治療アイテムパイプラインprocess_itemの並列または順次実行

私は現在、治療がprocess_itemを複数の項目に対して並行して呼び出すか、または順番に1つの項目に対して順次呼び出すかどうか疑問に思っています。後者のような場合、私は単純に以下のアプローチを使用することができる:

def process_item(self, item, spider): 
    # execute insert statements 
    connection.commit() 

process_itemに複数のコールをscrapyによって同時に実行されている場合は、終了時にcommit()の呼び出しが別のながら呼ぶことができアイテムが完全に挿入されていません。

documentation for item pipelines状態:

アイテムがスパイダーによって掻き取られた後、それが順次実行されるいくつかのコンポーネントを介してそれを処理項目パイプラインに送られます。

しかし、私はそれがprocess_itemが並列に実行されることはありませんか、単にその異なるパイプラインは常に重複の削除(たとえば次々に実行されることを意味するかどうかはかなりよく分からない - > DB挿入 - 何かを変更します> )。


Iはprocess_itemがドキュメントは、次の例に示すように、順次実行されることを考える:それでもIドン、このコードで

class DuplicatesPipeline(object): 

def __init__(self): 
    self.ids_seen = set() 

def process_item(self, item, spider): 
    if item['id'] in self.ids_seen: 
     raise DropItem("Duplicate item found: %s" % item) 
    else: 
     self.ids_seen.add(item['id']) 
     return item 

を、関与ids_seenにIDを追加するための同期化が存在しませんパイプラインの使用方法を示しているだけなので、例が簡略化されているかどうかはわかりません。

答えて

1

設定のドキュメントでは、項目がパラレルで処理されるように指定されています(少なくとも1つの応答内で)。私はそれを1に設定するとあなたの場合に役立つでしょう。

私はScrapyのこの部分について専門家はいませんが、私はthis is where it happensと信じています。

+0

ありがとうございます、どういうわけか私はこのオプションを見ていません! – Alex

関連する問題