4

応答を解析するメソッドが複数ある Scrapy スパイダーのコントラクトを作成する最良の方法は何ですか? 私はこの答えを見ましたが、私にはあまり明確に聞こえませんでした。

私の現在の例:parse_productページ上の情報を抽出するというメソッドがありますが、別のページの同じ製品について抽出する必要があるデータが他にもあるためyield、このメソッドの最後に新しいリクエストを作成する新しいリクエストを作成します。新しいコールバックがこれらのフィールドを抽出し、アイテムを返すようにします。

問題は、2 番目の方法のコントラクトを作成すると、meta 属性 (ほとんどのフィールドを持つ項目を含む) がないために失敗することです。最初のメソッドのコントラクトを作成すると、アイテムではなく新しいリクエストが返されるため、フィールドが返されるかどうかを確認できません。

def parse_product(self, response):
    il = ItemLoader(item=ProductItem(), response=response)
    # populate the item in here

    # yield the new request sending the ItemLoader to another callback
    yield scrapy.Request(new_url, callback=self.parse_images, meta={'item': il})

def parse_images(self, response):
     """
     @url http://foo.bar
     @returns items 1 1
     @scrapes field1 field2 field3
     """
     il = response.request.meta['item']
     # extract the new fields and add them to the item in here

     yield il.load_item()

この例では、コントラクトを 2 番目の方法に入れましたが、最初の方法で入力されたフィールドとフィールドにもKeyError例外が発生しました。response.request.meta['item']field1field2

それが十分に明確であることを願っています。

4

1 に答える 1

5

率直に言って、私は Scrapy コントラクトを使用していません。それらには多くの問題があり、いつか Scrapy から削除される可能性があります

実際には、スパイダーの単体テストを使用することはあまりうまくいきませんでした。

開発中にスパイダーをテストするには、キャッシュを有効にしてから、スクレイピングを正しく行うために必要な回数だけスパイダーを再実行します。

リグレッション バグについては、オンザフライで検証を行うアイテム パイプライン (またはスパイダー ミドルウェア) を使用した方が運が良かったです (いずれにせよ、初期のテストでキャッチできるものは限られています)。また、回復のための戦略を立てることもお勧めします。

そして、健全なコードベースを維持するために、ライブラリのようなコードをスパイダー自体から常に移動させて、よりテストしやすくします。

これがあなたが探している答えでない場合は申し訳ありません。

于 2016-07-05T00:05:02.477 に答える