如何在失败时重试scrapy任务

时间:2016-04-06 13:03:00

标签: web-scraping scrapy

我对scrapy相对较新。我遇到一些页面无法正确加载的情况。我想再次重试该任务2次,以确保它正常工作。请注意,我没有收到404错误,但由于某些缺少元素而导致解析结果时失败。

仅在少数几个案例中发生,我无法重现它,因为它在下次重试时通过。 (通过捕获整个响应机构进行验证)

处理这个问题的好方法是什么?

我试过

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

但我认为这些已被过滤并被scrapy识别为重复。什么是解决这个问题的最佳方法?

2 个答案:

答案 0 :(得分:0)

这是我最终如何实现我的解决方案。

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)

答案 1 :(得分:0)

您应该在errback中使用scrapy.Request处理程序。

这里是示例: ```

def start_requests(self):
    for url in self.start_urls:
        yield scrapy.Request(
            url=url,
            dont_filter=True,
            callback=self.apply_filter,
            errback=self.handle_failure)

def handle_failure(self, failure):
    self.log(failure, level=logging.ERROR)
    # try with a new proxy
    self.log('restart from the failed url {}'.format(failure.request.url))
    yield scrapy.Request(
        url=failure.request.url,
        callback=self.parse,
        errback=self.handle_failure)

```