2016-04-06 8 views
0

私は比較的新しい治療法です。私はいくつかのページが正しく読み込まれない状況に遭遇しています。私はそのタスクを2回再試行して、正しく動作するようにします。 404エラーは表示されませんが、欠落している要素が原因で結果が解析されないことに注意してください。どのように私は失敗時に治療タスクを再試行しますか

これは数百のうちのほんのわずかのケースで発生し、次回再試行するときに再現できません。 (応答本体全体をキャプチャして確認)

これを処理するにはどうすればよいでしょうか?

私は

def parse(self, response): 
    try: 
     #do something 
     yield result 
    except: 
     yield Request(response.url, callback=self.parse) 

をやってみましたが、私は、これらがscrapyにより重複として濾過し、認識なっていると思います。この問題に近づく最善の方法は何でしょうか?

+1

、あなたは '降伏要求(response.url、コールバック= self.parse、dont_filter =真)' –

+0

おかげで多くを使用することができ、それが役立ちます。とにかく、私は本当の失敗のために再試行を終わらせないために反復回数を制限することができます。 – pankaj

+1

Exceptionで再試行のために設定した条件になります。再試行する例外を絞り込むことができます。また、['RetryMiddleware']のようにリクエストの' meta'にカウントを保存することもできます(https://github.com/scrapy/scrapy/blob/ebef6d7c6dd8922210db8a4a44f48fe27ee0cd16/scrapy/downloadermiddlewares/retry.py#L62) –

答えて

0

ここで私は最終的に私のソリューションを実装しました。 Scrapyフィルタリング重複要求を防ぐために

def parse(self, response): 
    meta = response.meta 
    retries = meta.get(MISSING_RATINGS_RETRY_COUNT, 0) 
    if retries < MAX_RETRIES: 
     throw_on_failure = True 
    else: 
     throw_on_failure = False 
    try: 
     #do something 
     #use throw_on_failure variable to thorw the exception based on missing data from the response. 
     yield result 
    except specificException: 
     meta[MISSING_RATINGS_RETRY_COUNT] = retries + 1 
     yield Request(response.url, callback=self.parse, meta=meta, dont_filter=True) 
関連する問題