scrapy 失败时如何重试零碎任务

tyu7yeag  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(327)

我对Scrapy比较陌生。我遇到了一些页面无法正确加载的情况。我想再次重试该任务2次以确保它正确工作。请注意,我没有得到404错误,但它在解析结果时由于缺少某些元素而失败。
这种情况只发生在一百个案例中的几个案例中,并且在下次重试时无法再现它。(通过捕获整个响应主体进行验证)
怎么样才是处理这个问题的好办法呢?
我试过

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

但是我认为这些正在被Scrapy过滤并识别为重复项。解决这个问题的最好方法是什么?

aiazj4mn

aiazj4mn1#

您应该改用scrapy.Request中的errback处理程序。
下面是一个例子:```

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

sdnqo3pr2#

下面是我最终实现我的解决方案的过程。

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)

相关问题