python requests请求失败重试_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(, '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(, 'Connection to www.google.com.hk timed out. (connect timeout=5)'))
2018-12-14 15:34:23
相关博文推荐:
python requests请求失败重试_Python:requests:详解超时和重试相关推荐
- python安装requests库超时_【Python 库】requests 详解超时和重试
网络请求不可避免会遇上请求超时的情况,在 requests 中,如果不设置你的程序可能会永远失去响应. 超时又可分为连接超时和读取超时. 连接超时 连接超时指的是在你的客户端实现到远端机器端口的连接时 ...
- python中递归函数的实例_Python 递归函数详解及实例
Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是 ...
- python可以开多少线程_python多线程详解
python多线程详解 一.线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一 ...
- python绘制turtle心电图代码_Python代码详解:入门时间序列分类
我们接触的大多数时间序列数据主要涉及产生预测的交易.无论是预测产品的需求还是销售额,航空公司的乘客数量或特定股票的收盘价,我们都习惯于利用久经考验的时间序列技术来预测需求. 但随着生成的数据量呈指数增 ...
- python的字符串包括哪些_python 字符串详解
python 字符串 介绍字符串相关的:比较,截取,替换,长度,连接,反转,编码,格式化,查找,复制,大小写,分割等操作 什么是字符串 字符串或串(String)是由数字.字母.下划线组成的一串字符. ...
- python出现traceback什么意思_Python Traceback详解
刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限. ...
- python解释器的工作原理_python解释器详解
Python是一门编程语言,但是从目前的实现来讲,Python也是一个名为解释器的软件包,解释器是一种让其他程序运行起来的程序,当你编写了一段Python程序,Python解释器将读取程序,并且按照其 ...
- python虚拟环境是什么意思_Python虚拟环境详解
和其他大多数现代编程语言一样,Python对包和模块的下载.存储以及管理有其自己的一套方法.Python的包一般存在几个地方.比如,大部分系统包会存在sys.prefix指定的路径下.在Mac OS ...
- python脚本运行时网络异常_Python中异常重试的解决方案详解
前言 大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理. 原先的流程: def crawl_page(url): pass def log_ ...
最新文章
- java并发编程_Java并发编程之 synchronized
- java好还是python好-Python和Java该如何选择?选哪个好?
- 信号处理的流程linux,linux信号处理机制
- 计算机办公高级试题,高级办公软件试题及解答
- 读书笔记_Effective_C++_条款十九:设计class犹如设计type
- 深度优先搜索重要模板
- redis和php有什么,redis主要用来做什么
- 如何让Win7不再弹出升级Win10的提醒窗口
- tftp服务器离线安装
- 安装GLPI资产管理
- 章鱼网络应用链|为什么 DEIP 会选择章鱼网络?
- aotorun专杀工具(U盘病毒专杀)
- SEO分析关键词策略
- 华为交换机查看端口对应的oid索引值
- 39. 组合总和(Python)
- 『 云原生·Docker』虚拟机与容器
- C51模拟PS2键盘(二)
- 显卡算力表-arch-架构
- 上传图片预览(服务器版)组件
- 7-199 水仙花求和
热门文章
- Linux fork与vfork的区别
- Git(12)-- Git 分支 - 分支简介
- [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up.解决办法
- RTMP 协议包头参考
- Android java时间戳转年月日时分秒
- Mac 10.12启动QXDM crash解决
- Android 蓝牙开发(五)OPP接收文件
- 制作OTA U盘升级包
- webgis之相关工具
- C#之Unix时间和北京时间互转