2017-11-03 6 views
0

Scrapyを使用して不動産追加をクロールしています。
フィールド価格とサイズ(m2)がありますので、price_per_m2を価格/サイズとして計算できます。
Scrapyの他のファイルから計算されるフィールドを追加する場所

Scrapyのベストプラクティスに従って、私はどこでこれを(どのクラスで)行うべきですか?

私はscrapy.Spiderでそれを持っていますが、私は他の場所(パイプラインのような場所)でどうすればいいのでしょうか(コード例が好きですか?

答えて

1

すべてのアイテムに共通の計算(または一般的な後処理)がある場合は、パイプラインを使用する方法が考えられます。不動産では、たとえば住所をジオコーディングしたり、各項目をデータベースに格納したりすることができます。私の意見では、パイプラインを使用する主な理由は、このロジックを変更する必要があるときに、メンテナンスの場所が1つあるので、この追加ロジックをスパイダーから分離することです。上記の例では、ジオコーディングプロバイダを変更するか、1つのデータベースエンジンを使用する代わりに、別のデータベースエンジンに切り替えることができます。それがパイプラインの本当の強みです。それは、変更しにくい価格とサイズからm2当たりの価格を計算することは、スパイダーコードに安全に置くことができます。一方、このような単純な計算がある場合は、すべてのスパイダーで同じコードを繰り返す時間を節約するためにパイプラインを使用することを検討することもできます。

1

いくつかの点でTomasに同意することができますが、私は決してこの計算をスパイダー自体には入れません。

私はスパイダーを使ってページからデータを抽出します。私にとっては、それが蜘蛛の唯一の目的です。私は抽出されたデータと基本的な操作(同じベースユニットにすべてを変換するような)をクリーニングするためにItemLoaderを使用します。最後に、アイテムからのフィールドを結合するような高レベルのデータ操作にパイプラインを使用します。

あなたは十数個のスパイダーがあり、その中にprice_per_m2を計算したとします。あなたのプロジェクトは成長し、別の国のためにスパイダーをコーディングし始めます。あなたはスパイダーがGBP、EUR、USDで価格を取得しています。今度はprice_per_m2を比較したい場合は、1)計算前に各スパイダーのユニットを変換するか、2)後処理を行うためにアイテムにメタデータを追加する必要があります。両方のアプローチは私の意見では厄介です。私のアプローチ:スパイダーはデータを抽出し、ItemLoaderはすべての価格を同じ単位に変換します。いくつかのパイプラインはすべてのアイテム(すべて同じユニット内にある)に対してprice_per_m2を計算します。

+0

私はTomasから答えを選択しました。なぜなら、彼が最初の人だったからです。それは残念です:-)。 ItemLoader(https://doc.scrapy.org/en/latest/topics/loaders.html#input- and-output-processors)のすべての価格を同じ単位に変換するのはなぜ、スパイダーではないのか説明できますか?私はScrapyフレームワークの背後にある論理を理解しようとしています。 – WebOrCode

+0

1)理想的には、アイテム自体に単位変換のような操作をしたいと考えています。しかし、スクリーニングデザインは異なるアプローチに従っており、私はそれと戦わない。 ItemLoaderは、この操作を実行できるItemに最も近いものです。 2)それはもっと乾燥しています:ItemLoaderを使用するときは単位変換とすべてを1つのプロセッサで処理しますが、スパイダーで処理するとコード/ロジックを複製します。 – Djunzu

関連する問題