1

ドメインをクロールするためにscrapyを使用します。sqlalchemy を使用して、そのすべての情報をデータベースに保存する予定です。これはページごとの非常に単純な xpath セレクターであり、HttpCacheMiddleware を使用する予定です。

理論的には、スパイダーからデータを取得したらすぐにデータベースにデータを挿入できます (これには、少なくとも hxs をインスタンス化する必要があります)。これにより、アイテムのサブクラスのインスタンス化をバイパスできるため、パイプラインを通過するアイテムがなくなります。

そうすることの利点は次のとおりです。

  1. パイプラインの CPU 処理がないため、CPU への負荷が少ない
  2. メモリリークを防ぎます。

ディスク I/O はネットワーク I/O よりもはるかに高速であるため、これがスパイダーに大きな影響を与えるとは思いません。

Scrapy の Item クラスを使用したい理由はありますか?

4

2 に答える 2

7

スパイダー内に直接挿入すると、スパイダーはデータが挿入されるまでブロックします。アイテムを作成してパイプラインに渡すと、データが挿入されている間、スパイダーは引き続きクロールできます。また、複数のスパイダーが同時にデータを挿入しようとすると、競合状態が発生する可能性があります。

于 2012-11-20T08:55:22.600 に答える
0

これは古い質問ですが、支持された答えは本当に正しくないと思います。

ItemScrapy のクラスを使用したい理由はありますか?

Web スクレイピングの Scrapy モデルは基本的に次のとおりです。

  1. スパイダーを使ってデータを収集します。
  2. そのデータをアイテムにまとめる。
  3. これらのアイテムをアイテム パイプラインで処理します。
  4. これらのアイテムを、さらに別のアイテム パイプラインを使用してどこかに保存します。

ステップ 3 と 4 は、「大きな」アイテム パイプラインを構成します。をサブクラス化しないItemと、アイテム パイプラインにオブジェクトを入力できないため、フィールドを正規化し、すべてスパイダー内でアイテムをデータベースに挿入する必要があります。

subclassを実行するItemと、アイテム処理コードをより保守しやすくすることができます。

from scrapy.item import Item, Field
from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import MapCompose, Identity

class Product(Item):
    name = Field()
    price = Field()

    aisle = Field()
    categories = Field()

class ProductLoader(XPathItemLoader):
    default_item_class = Product

    price_in = MapCompose(parse_price)
    categories_out = Identity()
于 2013-11-05T01:00:23.720 に答える