Python:requests:详解超时和重试
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:requests:详解超时和重试,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3652字,纯文字阅读大概需要6分钟。
内容图文
![Python:requests:详解超时和重试](/upload/InfoBanner/zyjiaocheng/719/2393473b2cda47dabfee8ebda36f708e.jpg)
Python:requests:详解超时和重试
网络请求不可避免会遇上请求超时的情况,在 requests 中,如果不设置你的程序可能会永远失去响应。
超时又可分为连接超时和读取超时。
连接超时
连接超时指的是在你的客户端实现到远端机器端口的连接时(对应的是connect()
),Request 等待的秒数。
import?time
import?requests
url?=?'http://www.google.com.hk'
print(time.strftime('%Y-%m-%d?%H:%M:%S'))
try:
????html?=?requests.get(url,?timeout=5).text
????print('success')
except?requests.exceptions.RequestException?as?e:
????print(e)
print(time.strftime('%Y-%m-%d?%H:%M:%S'))
因为 google 被墙了,所以无法连接,错误信息显示 connect timeout(连接超时)。
2018-12-14?14:38:20
HTTPConnectionPool(host='www.google.com.hk',?port=80):?Max?retries?exceeded?with?url:?/?(Caused?by?ConnectTimeoutError(<urllib3.connection.HTTPConnection?object?at?0x00000000047F80F0>,?'Connection?to?www.google.com.hk?timed?out.?(connect?timeout=5)'))
2018-12-14?14:38:25
就算不设置,也会有一个默认的连接超时时间(我测试了下,大概是21秒)。
读取超时
读取超时指的就是客户端等待服务器发送请求的时间。(特定地,它指的是客户端要等待服务器发送字节之间的时间。在 99.9% 的情况下这指的是服务器发送第一个字节之前的时间)。
简单的说,连接超时就是发起请求连接到连接建立之间的最大时长,读取超时就是连接成功开始到服务器返回响应之间等待的最大时长。
如果你设置了一个单一的值作为 timeout,如下所示:
r?=?requests.get('https://github.com',?timeout=5)
这一 timeout 值将会用作 connect 和 read 二者的 timeout。如果要分别制定,就传入一个元组:
r?=?requests.get('https://github.com',?timeout=(3.05,?27))
黑板课爬虫闯关的第四关正好网站人为设置了一个15秒的响应等待时间,拿来做说明最好不过了。
import?time
import?requests
url_login?=?'http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex03/'
session?=?requests.Session()
session.get(url_login)
token?=?session.cookies['csrftoken']
session.post(url_login,?data={'csrfmiddlewaretoken':?token,?'username':?'xx',?'password':?'xx'})
print(time.strftime('%Y-%m-%d?%H:%M:%S'))
url_pw?=?'http://www.heibanke.com/lesson/crawler_ex03/pw_list/'
try:
????html?=?session.get(url_pw,?timeout=(5,?10)).text
????print('success')
except?requests.exceptions.RequestException?as?e:
????print(e)
print(time.strftime('%Y-%m-%d?%H:%M:%S'))
错误信息中显示的是 read timeout(读取超时)。
2018-12-14?15:20:47
HTTPConnectionPool(host='www.heibanke.com',?port=80):?Read?timed?out.?(read?timeout=10)
2018-12-14?15:20:57
读取超时是没有默认值的,如果不设置,程序将一直处于等待状态。我们的爬虫经常卡死又没有任何的报错信息,原因就在这里了。
超时重试
一般超时我们不会立即返回,而会设置一个三次重连的机制。
def?gethtml(url):
????i?=?0
????while?i?<?3:
????????try:
????????????html?=?requests.get(url,?timeout=5).text
????????????return?html
????????except?requests.exceptions.RequestException:
????????????i?+=?1
其实 requests 已经帮我们封装好了。(但是代码好像变多了...)
import?time
import?requests
from?requests.adapters?import?HTTPAdapter
s?=?requests.Session()
s.mount('http://',?HTTPAdapter(max_retries=3))
s.mount('https://',?HTTPAdapter(max_retries=3))
print(time.strftime('%Y-%m-%d?%H:%M:%S'))
try:
????r?=?s.get('http://www.google.com.hk',?timeout=5)
????return?r.text
except?requests.exceptions.RequestException?as?e:
????print(e)
print(time.strftime('%Y-%m-%d?%H:%M:%S'))
max_retries
为最大重试次数,重试3次,加上最初的一次请求,一共是4次,所以上述代码运行耗时是20秒而不是15秒
2018-12-14?15:34:03
HTTPConnectionPool(host='www.google.com.hk',?port=80):?Max?retries?exceeded?with?url:?/?(Caused?by?ConnectTimeoutError(<urllib3.connection.HTTPConnection?object?at?0x0000000013269630>,?'Connection?to?www.google.com.hk?timed?out.?(connect?timeout=5)'))
2018-12-14?15:34:23
内容总结
以上是互联网集市为您收集整理的Python:requests:详解超时和重试全部内容,希望文章能够帮你解决Python:requests:详解超时和重试所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。