Web scraping 如何在失败时重试重复的任务

Web scraping 如何在失败时重试重复的任务,web-scraping,scrapy,Web Scraping,Scrapy,我对刮痧比较陌生。我遇到了一些页面无法正确加载的情况。我想再次重试该任务2次,以确保其正常工作。请注意,我没有收到404错误,但由于缺少某些元素,在解析结果时失败 它只发生在数百个案例中的少数案例中,我无法复制它,因为下次重试时它会消失。(通过捕获整个响应主体进行验证) 处理这个问题的好方法是什么 我试过了 def parse(self, response): try: #do something yield result except:

我对刮痧比较陌生。我遇到了一些页面无法正确加载的情况。我想再次重试该任务2次,以确保其正常工作。请注意,我没有收到404错误,但由于缺少某些元素,在解析结果时失败

它只发生在数百个案例中的少数案例中,我无法复制它,因为下次重试时它会消失。(通过捕获整个响应主体进行验证)

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

我试过了

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

但我认为这些被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)
def解析(self,response):
meta=response.meta
retries=meta.get(缺少评分\u重试\u计数,0)
如果重试次数<最大重试次数:
在失败时抛出=真
其他:
在失败时抛出错误=错误
尝试:
#做点什么
#使用throw_on_failure变量根据响应中丢失的数据来处理异常。
产量结果
除特殊例外情况外:
meta[缺少评分\u重试\u计数]=重试次数+1
屈服请求(response.url,callback=self.parse,meta=meta,dont\u filter=True)

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

以下是一个例子: ```


```

为了防止重复请求的过滤,您可以使用
yield Request(response.url,callback=self.parse,dont\u filter=True)
非常感谢,这很有帮助。无论如何,我可以限制迭代次数,以确保我不会因为真正的失败而重试。这取决于您为异常重试设置的条件。您可能希望缩小要重试的异常范围。您还可以在请求的
元中保留一个计数,非常感谢!已成功创建异常并从爬网程序本身重试。使用元键记录重试次数。非常感谢。也许你忘了在
缺少评分\u重试\u计数
周围加引号了?
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)