高速——request请求
为防止服务器响应缓慢,导致客服端处理异常,requests请求大多设置 timeout 参数。Requests中timeout不设置默认值。
读取超时是没有默认值的,如果不设置,程序将一直处于等待状态。我们的爬虫经常卡死又没有任何的报错信息,原因就在这里了。
Timeout 类型:
超时可分为连接超时和读取超时
连接超时:指的是客户端实现到远端服务器端口的连接时request 所等待的时间。连接超时一般设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口的默认大小是 3。
读取超时:指的客户端已经连接上服务器并且发送了request后,客户端等待服务器发送请求的时间。(一般指的是服务器发送第一个字节之前的时间)。
客户端timeout 秒内从基础套接字上必须接收到第一个字节的数据, 否则抛出超时异常。
timeout 设置单一的值,将会用作 connect 和 read 二者的 timeout。
即连接超时和读取超时的时间之和
requests.get('https://github.com', timeout=5)
timeout 设置分别制定,就需要传入一个元组。
requests.get('https://github.com', timeout=(3.05, 27))
如果需要让 request 永远等待,则传入一个 None 作为 timeout 的值。
requests.get('https://github.com', timeout=None)
超时重试
一般超时我们不会立即返回,而会设置一个三次重连的机制。
其实 requests 已经帮我们封装好了。(但是代码好像变多了...)
max_retries 为最大重试次数,重试3次,加上最初的一次请求,一共是4次,所以上述代码运行耗时是20秒而不是15秒