python爬虫解决timed out 的几种方法
在请求量比较大,目标网站承重量有限的情况下可能会出现下面这种报错:
Max retries exceeded with url:...... Connection to www.xxxx.com timed out
一开始想着增加timeout的大小,但后来发现这样不仅降低了爬取速度,而且并不能有效的解决这种问题,后来在看了看别人的建议,试着用了下面几种方法,问题有效解决
1. retrying 模块
from retrying import retry
源码部分:
def __init__(self,
stop=None, wait=None,
stop_max_attempt_number=None,
stop_max_delay=None,
wait_fixed=None,
wait_random_min=None, wait_random_max=None,
wait_incrementing_start=None, wait_incrementing_increment=None,
wait_exponential_multiplier=None, wait_exponential_max=None,
retry_on_exception=None,
retry_on_result=None,
wrap_exception=False,
stop_func=None,
wait_func=None,
wait_jitter_max=None):
- stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就停止重试
- stop_max_delay:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束 或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了
- wait_fixed:设置在两次retrying之间的停留时间
- wait_random_min和wait_random_max:用随机的方式产生两次retrying之间的停留时间
- wait_exponential_multiplier和wait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产 生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max
@retry装饰器,如出现异常会一直重试
@retry()
def start_requests(self):
stop_max_attempt_number 设置最大重试次数
@retry(stop_max_attempt_number=7)
def start_requests(self):
stop_max_delay 设置失败重试的最大时间, 单位毫秒,超出时间,则停止重试
@retry(stop_max_delay=10000)
wait_fixed 设置失败重试的间隔时间
@retry(wait_fixed=2000, stop_max_delay=10000)
wait_random_min, wait_random_max 设置失败重试随机性间隔时间
@retry(wait_random_min=1000, wait_random_max=5000, stop_max_delay=10000)
借助retrying模块在超时时尝试重新连接
2.增加重试连接次数,requests.adapters.DEFAULT_RETRIES
#设置重连次数
requests.adapters.DEFAULT_RETRIES = 15
# 设置连接活跃状态为False
s = requests.session()
s.keep_alive = False # 在连接时关闭多余连接
和第一种方法搭配使用并不能叠加
3.限制爬取速度 DOWNLOAD_DELAY,CONCURRENT_REQUESTS
DOWNLOAD_DELAY = 0.5
RANDOMIZE_DOWNLOAD_DELAY = True # 随机的等待时间
CONCURRENT_REQUESTS = 1 # Scrapy框架同时请求的最大数量
好记性不如烂指头,记录工作与学习当中碰到的BUG,如有错误还请指出