応答を解析するメソッドが複数ある 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']
field1
field2
それが十分に明確であることを願っています。