网络请求不可避免会遇上请求超时的情况,在 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:详解超时和重试相关推荐

  1. python安装requests库超时_【Python 库】requests 详解超时和重试

    网络请求不可避免会遇上请求超时的情况,在 requests 中,如果不设置你的程序可能会永远失去响应. 超时又可分为连接超时和读取超时. 连接超时 连接超时指的是在你的客户端实现到远端机器端口的连接时 ...

  2. python中递归函数的实例_Python 递归函数详解及实例

    Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是 ...

  3. python可以开多少线程_python多线程详解

    python多线程详解 一.线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一 ...

  4. python绘制turtle心电图代码_Python代码详解:入门时间序列分类

    我们接触的大多数时间序列数据主要涉及产生预测的交易.无论是预测产品的需求还是销售额,航空公司的乘客数量或特定股票的收盘价,我们都习惯于利用久经考验的时间序列技术来预测需求. 但随着生成的数据量呈指数增 ...

  5. python的字符串包括哪些_python 字符串详解

    python 字符串 介绍字符串相关的:比较,截取,替换,长度,连接,反转,编码,格式化,查找,复制,大小写,分割等操作 什么是字符串 字符串或串(String)是由数字.字母.下划线组成的一串字符. ...

  6. python出现traceback什么意思_Python Traceback详解

    刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限. ...

  7. python解释器的工作原理_python解释器详解

    Python是一门编程语言,但是从目前的实现来讲,Python也是一个名为解释器的软件包,解释器是一种让其他程序运行起来的程序,当你编写了一段Python程序,Python解释器将读取程序,并且按照其 ...

  8. python虚拟环境是什么意思_Python虚拟环境详解

    和其他大多数现代编程语言一样,Python对包和模块的下载.存储以及管理有其自己的一套方法.Python的包一般存在几个地方.比如,大部分系统包会存在sys.prefix指定的路径下.在Mac OS ...

  9. python脚本运行时网络异常_Python中异常重试的解决方案详解

    前言 大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理. 原先的流程: def crawl_page(url): pass def log_ ...

最新文章

  1. java并发编程_Java并发编程之 synchronized
  2. java好还是python好-Python和Java该如何选择?选哪个好?
  3. 信号处理的流程linux,linux信号处理机制
  4. 计算机办公高级试题,高级办公软件试题及解答
  5. 读书笔记_Effective_C++_条款十九:设计class犹如设计type
  6. 深度优先搜索重要模板
  7. redis和php有什么,redis主要用来做什么
  8. 如何让Win7不再弹出升级Win10的提醒窗口
  9. tftp服务器离线安装
  10. 安装GLPI资产管理
  11. 章鱼网络应用链|为什么 DEIP 会选择章鱼网络?
  12. aotorun专杀工具(U盘病毒专杀)
  13. SEO分析关键词策略
  14. 华为交换机查看端口对应的oid索引值
  15. 39. 组合总和(Python)
  16. 『 云原生·Docker』虚拟机与容器
  17. C51模拟PS2键盘(二)
  18. 显卡算力表-arch-架构
  19. 上传图片预览(服务器版)组件
  20. 7-199 水仙花求和

热门文章

  1. Linux fork与vfork的区别
  2. Git(12)-- Git 分支 - 分支简介
  3. [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up.解决办法
  4. RTMP 协议包头参考
  5. Android java时间戳转年月日时分秒
  6. Mac 10.12启动QXDM crash解决
  7. Android 蓝牙开发(五)OPP接收文件
  8. 制作OTA U盘升级包
  9. webgis之相关工具
  10. C#之Unix时间和北京时间互转