2017-04-10 15 views
0

私の治療スクリプトが、自分のMySQLデータベースにpipelines.pyの代わりにスパイダー本体に書き込むことは重要ですか?これはクモを減速させますか? item.pyに記載されているアイテムはありません。pipelines.pyでスパイダーv/v経由でdbに書き込む

フォローアップ:どのように、いつpipelines.pyが呼び出されますか?利回り計算書の後に何が起こるか?

答えて

1

これは実装に大きく依存しますが、あまりブロックしないような方法でデータベース書き込みを実装すると、あまりパフォーマンスはあまり変わりません。

しかし、かなり大きな構造的な違いがあります。 Scrapyのデザイン哲学は、スパイダーをきれいに理解できるようにするために、ミドルウェアとパイプラインの使用を強く推奨しています。

言い換えれば、クモの巣ビットはデータをクロールする必要があり、ミドルウェアは要求と応答を変更し、パイプラインは返されたデータを(データベースやファイルに置くなどの)外部ロジックによってパイプ処理する必要があります。

方法とpipelines.pyが呼び出される:

質問あなたのフォローアップについては?利回り計算書の後に何が起こるか?

Architectual Overview documentation pageを見て、あなたは深く掘るしたい場合は、scrapyがその周りだけ大きな、スマートなフレームワークであるため twisted asyncroniousフレームワークを理解する必要があると思います。

+0

"パイプラインは返されたデータを何らかの外部ロジックを介してパイプする必要があります" - pedanticですが、拡張子を使用する方が良いでしょう。 /topics/feed-exports.html)。 [this](https://github.com/scrapy/scrapy/blob/d8672689761f0bb6c0550a841f35534265e87fee/scrapy/extensions/feedexport.py)は、scrapyにデフォルトのフィードエクスポートがある場所です。パイプラインは、「アイテム」を豊かにしたり、落としたりするドメイン固有のビジネスロジックのためのものです。 – neverlastn

+0

@neverlastnパイプライン経由で非同期エクスポートを行うことはできません。すべてのScrapyエンジンが常にアクセス可能なねじれエンジンで実行された後であることを意味します。内蔵の飼料輸出業者も伸びにくいです。私は、外部のスクリプトやプログラムを呼び出す必要はなく、ページの解析ではないものとして「外部ロジック」を意味すると思います。 – Granitosaurus

+0

私は少しシニカルになっているかもしれませんが、非常に小さなクロール以外は、ローカルファイルにダンプするのが最も簡単で、クロールの最後に別の手法を使用してバッチインポートします(たとえば、単一のSQLトランザクションを1回だけロックすることによって)。さもなければ、大部分の人が正しく取得できない非同期API、奇妙なパフォーマンスの問題、およびバッチごとのバッチ/ジョブインポートのモデルが悪い挿入パフォーマンスを意味し、破損したデータを重複排除または修正する必要がある例えばあなたの仕事がクラッシュし、再起動が必要な場合。 – neverlastn

1

最高のパフォーマンスが必要な場合は、ファイル(例:csv)にアイテムを格納し、クロールが完了したらデータベースに一括挿入します。 csvデータの場合、mysqlimportMySQL bulk insert from CSV data filesを参照)を使用できます。やりがいのあるアプローチは、挿入中にブロックしないことです。これには、Twisted RDBMS APIを使用するパイプラインを使用する必要があります。

関連する問題