最近使用scrapy爬虫的过程中遇到response 403的问题,由于服务器拒绝,需要重新retry。查了很久,翻看文档终于明白scrapy自带的retry如何使用。
配置setting.py,在网上可以随意查找到,设置启动retry机制,:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
}
RETRY_ENABLE=True
RETRY_TIMES=100
RETRY_HTTP_CODECS = [403]
HTTPERROR_ALLOWED_CODES = [403] #当遇到403的时候爬虫脚本不退出
设置完之后重新跑脚本发现好像没有任何反应,查找文档发现,需要返回新的request
在errback_parse中添加,errback_parse,是异常函数callback,当爬虫遇到异常时进入,细节可以查看文档:
def start_requests(self):
for u in self.start_urls:
yield scrapy.Request(u, callback=self.parse,
errback=self.errback_parse,
dont_filter=True)
def errback_parse(self, fail):
new_request = Request(url=fail.request.url, method="GET", cookies="")
new_request_or_none = get_retry_request(
new_request,
spider=self,
reason='retry',
)
return new_request_or_none
重新启动,当遇到403的时候就会有反应了:
但是直接重新retry服务器还是会拒绝,然后尝试产生新的request,但是url不变,重新提取数据。成功。虽然没有弄清楚最终的原因,测试是新的request和启动的request不一样。
def errback_parse(self, fail):
#new_request = Request(url="http://d.10jqka.com.cn/v6/line/hs_001896/02/all.js", method="GET", cookies="")
new_request = Request(url=fail.request.url, method="GET", cookies="")
new_request_or_none = get_retry_request(
new_request,
spider=self,
reason='retry',
)
return new_request_or_none