6

さまざまな Web サイトに関するいくつかの情報を収集しようとしています。Itemどのページで見つけたかに関係なく、そのサイト全体で見つけた情報を要約したサイトごとに 1 つ作成したいと考えています。

クローラーが最初に調べたページの結果ではなく、の最終的なコンテンツが必要であることを除いて、これは重複フィルターの例のようなアイテム パイプラインであるべきだと思います。Item

そこで、特定のサイトのさまざまなs にrequest.meta部分的に入力された単一の s を渡すために使用してみました。これを機能させるには、アクセスするページがなくなるまでparse コールバックが 1 回の呼び出しで正確に 1 つの new を返すようにし、最後に finished を返す必要がありました。たどりたい複数のリンクを見つけた場合、これは苦痛であり、リンク サイクルのためにスケジューラが要求の 1 つを破棄すると完全に機能しなくなります。ItemRequestRequestItem

私が見ることができる他の唯一のアプローチは、スパイダー出力をjson-linesにダンプし、外部ツールで後処理することです。しかし、できればミドルウェアまたはアイテムのパイプラインで、スパイダーに折りたたむことをお勧めします。どうやってやるの?

4

3 に答える 3

4

この醜い解決策はどうですか?

サイトごとのデータを格納するために、パイプラインでディクショナリ (defaultdict(list)) を定義します。process_item では、dict(item) をサイトごとのアイテムのリストに追加して、DropItem 例外を発生させることができます。次に、close_spider メソッドで、必要な場所にデータをダンプできます。

理論的にはうまくいくはずですが、この解決策が最適かどうかはわかりません。

于 2013-04-07T06:10:22.897 に答える
0

クローラーを書いていたときも同じ問題がありました。

URL のリストを meta タグを介して渡し、それらをチェーンすることで、この問題を解決しました。

ここに書いた詳細なチュートリアルを参照してください。

于 2016-02-16T08:18:15.450 に答える