私はいくつかのアイテムを正常に生成しているスクラピースパイダーを開発しています。これらの項目は、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を追加するための同期化が存在しませんパイプラインの使用方法を示しているだけなので、例が簡略化されているかどうかはわかりません。
ありがとうございます、どういうわけか私はこのオプションを見ていません! – Alex