我对scrapy相对较新。我遇到一些页面无法正确加载的情况。我想再次重试该任务2次,以确保它正常工作。请注意,我没有收到404错误,但由于某些缺少元素而导致解析结果时失败。
仅在少数几个案例中发生,我无法重现它,因为它在下次重试时通过。 (通过捕获整个响应机构进行验证)
处理这个问题的好方法是什么?
我试过
def parse(self, response):
try:
#do something
yield result
except:
yield Request(response.url, callback=self.parse)
但我认为这些已被过滤并被scrapy识别为重复。什么是解决这个问题的最佳方法?
答案 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)
```