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