2016-07-04 10 views
2

応答を解析する複数の方法を持つScrapyスパイダーのコントラクトを書くには、どのような方法が最適ですか? 私はこれを見たanswerしかし、それは私には非常に明確に聞こえませんでした。複数の解析方法を使った治療契約

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

問題は、2番目のメソッドのコントラクトを記述すると、メタ属性(ほとんどのフィールドを持つアイテムを含む)がないために失敗するということです。最初のメソッドの契約書を書くと、アイテムの代わりに新しいリクエストを返すので、フィールドを返すかどうかを確認できません。例では

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() 

、私は第二の方法で契約を置くが、それはresponse.request.meta['item']に私にKeyError例外を与え、また、フィールドfield1field2は、第一の方法に移入されています。

希望は十分です。

答えて

3

率直に言えば、私はScrapy契約を使用していませんし、誰もその使用を推奨していません。彼らはmany issuessomeday may be removed from Scrapyを持っています。

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

開発中のスパイダーをテストする場合は、キャッシュを有効にしてから、必要なだけスパイダーを再実行してスクレイピングの権利を取得します。

回帰バグについては、オンザフライで検証する項目パイプライン(またはスパイダーミドルウェア)を使用すると、より良い運が得られました(とにかく早い段階でテストできます)。回復のための戦略を立てることも良い考えです。

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

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

+1

これは私が探していた答えではありませんでしたが、実際の答え(存在する場合)よりも多分私を助けました。ありがとうございました。 –

関連する問題