python程序根据url从互联网上批量获取数据时,设置HTTP或Socket超时,来防止爬虫爬取某个页面时间过长,导致程序卡置不前。
全局设置。
import socket
socket.setdefaulttimeout(1)
t:代表经过t秒后,如果还未下载成功,自动跳入下一次操作,此次下载失败 。
使用timeout 参数可以设定等待连接的秒数,如果等待超时,Requests会抛出异常。
示例代码1:
import requests
res = requests.get('https://github.com', timeout=0.01)
print(res)
运行结果:
示例代码2:
import requests
res = requests.get('https://github.com', timeout=10)
print(res)
运行结果:
注意:timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)。
示例代码:
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:
res = s.get('https://github.com', timeout=2)
print(res)
except requests.exceptions.RequestException as e:
print(e)
print(time.strftime('%Y-%m-%d %H:%M:%S'))
运行结果:
注意:max_retries 为最大重试次数,重试3次,加上最初的一次请求,一共是4次,所以上述代码运行耗时至少是8秒而不是6秒。
示例代码1:
import requests
def get_html(url, timeout=5):
i = 0
while i < 3:
try:
html = requests.get(url, timeout=timeout)
return html.text
except requests.exceptions.RequestException as e:
i += 1
print(e)
res = get_html('https://github.com', timeout=0.1)
print(res)
运行结果:
示例代码2: 【试图提大timeout的值】
import requests
def get_html(url, timeout=5):
i = 0
while i < 3:
try:
html = requests.get(url, timeout=timeout)
return html.text
except requests.exceptions.RequestException as e:
i += 1
print(e)
res = get_html('https://github.com', timeout=10)
print(res)
运行结果: