import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl
# 自定义SSL上下文,解决可能的SSL验证问题
class CustomHttpAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(
num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1_2
)
# 创建会话对象
session = requests.Session()
# 设置连接池大小,connections表示最大的连接数,maxsize表示每个连接池的最大连接数
adapter = CustomHttpAdapter(connections=10, maxsize=10)
session.mount('http://', adapter)
session.mount('https://', adapter)
# 设置Basic认证信息
auth = ('user', 'pass')
# 设置超时时间,单位为秒,这里设置连接超时为5秒,读取超时为10秒
timeout = (5, 10)
try:
response = session.get('http://protected.example.com/data', auth=auth, timeout=timeout)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求发生异常: {e}")
代码解释
- 自定义SSL上下文:
CustomHttpAdapter
类继承自HTTPAdapter
,重写了init_poolmanager
方法,用于设置特定的SSL版本(PROTOCOL_TLSv1_2
),以解决可能的SSL验证问题。这在一些老版本的服务器或特定网络环境中可能会用到。
- 连接池设置:
- 创建
CustomHttpAdapter
对象adapter
,并设置connections
为10,表示最大的连接数为10;maxsize
也为10,表示每个连接池的最大连接数为10。这样可以在并发请求时复用连接,提高性能。
- 使用
session.mount
方法将这个适配器挂载到http://
和https://
协议上,使得会话对象session
在发送请求时使用我们设置好的连接池。
- Basic认证:
- 使用元组
('user', 'pass')
设置auth
变量,在session.get
请求中传递auth
参数,实现Basic认证。
- 超时时间设置:
timeout
变量设置为一个元组(5, 10)
,第一个值5表示连接超时时间为5秒,第二个值10表示读取超时时间为10秒。这样可以避免请求长时间等待,提高请求效率。如果在指定时间内连接不上服务器或无法读取响应数据,会抛出相应的异常。
- 异常处理:
- 使用
try - except
块捕获requests.exceptions.RequestException
异常,打印出请求过程中发生的异常信息,确保程序的健壮性。