解决HTTP 429错误的Scrapy中间件配置
# 导入必要的模块
import random
from scrapy.downloadermiddlewares.retry import RetryMiddleware
class CustomRetryMiddleware(RetryMiddleware):
"""
自定义的Scrapy重试中间件,用于处理HTTP 429错误。
"""
def __init__(self, retries=3, backoff_factor=0.5, stats=None):
self.max_retry_times = retries
self.backoff_factor = backoff_factor
self.stats = stats
def _retry(self, request, reason, spider):
# 如果已经尝试过的次数小于最大重试次数,则进行重试
if request.meta.get('retry_times', 0) < self.max_retry_times:
retry_times = request.meta.get('retry_times', 0) + 1
request.meta['retry_times'] = retry_times
if self.stats:
self.stats.inc_value('retry/count')
# 计算随机暂停时间
wait_time = int(random.uniform(1, 2 ** retry_times) * self.backoff_factor)
# 将请求放入调度队列,并设置延迟执行时间
retry_request = request.copy()
retry_request.meta['wait_time'] = wait_time
# 返回重试请求,由Scrapy框架处理
return retry_request
def process_response(self, request, response, spider):
if response.status == 429:
return self._retry(request, '429 Too Many Requests', spider)
return response
def process_exception(self, request, exception, spider):
return self._retry(request, exception, spider)
这段代码定义了一个自定义的Scrapy重试中间件,用于处理HTTP 429错误。它会在遇到该错误时自动进行重试,并且使用随机指数退避策略计算重试之间的等待时间。这样的中间件配置可以有效提高爬虫的稳定性和效率。
评论已关闭