Python-requests请求的超时时间

枫铃3年前 (2021-09-30)Python229

python程序根据url从互联网上批量下载图片时,设置HTTP或Socket超时,来防止爬虫爬取某个页面时间过长,导致程序卡置不前。

一种解决方案是全局设置:

import socket
socket.setdefaulttimeout(t)

t:代表经过t秒后,如果还未下载成功,自动跳入下一次操作,此次下载失败

另外一种解决方案是:

使用timeout 参数可以设定等待连接的秒数,如果等待超时,Requests会抛出异常

>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
>>> requests.get('https://www.baidu.com',timeout=0.5)
<Response [200]>

timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)。

第三种

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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秒

第四种:捕获请求异常:

def gethtml(url):
  i = 0
  while i < 3:
    try:
      html = requests.get(url, timeout=5).text
      return html
    except requests.exceptions.RequestException:
      i += 1

相关文章

Python 基础教程:位运算的奥妙

位运算是直接对内存中的二...

10道Python面试常见的问题

1.类继承 有如下的一段...

Python Sphinx使用踩坑记录

描述 使用 pip 安装sphinx后,按照教程建立了一个新的py文件,如下 # run.py def run(name):...

python struct模块的使用

struct模块中的函数...

Python如何实现单例模式?其他23中设计模式python如何实现?

单例模式主要有四种方法:new、共享属性、装饰器、import。 # __ new__方法: class Singleton(...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。