python爬虫解决timed out 的几种方法

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):

  1. stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就停止重试
  2. stop_max_delay:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束 或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了
  3. wait_fixed:设置在两次retrying之间的停留时间
  4. wait_random_min和wait_random_max:用随机的方式产生两次retrying之间的停留时间
  5. 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,如有错误还请指出

你可能感兴趣的:(python,python爬虫,requests,scrapy,timed,out)