【python】requests 库 源码解读、参数解读
文章目录
- 一、基础知识
- 二、Requests库详解
- 2.1 requests 库源码简要解读
- 2.2 参数解读
- 2.3 处理响应
- 2.4 错误处理
一、基础知识
以前写过2篇文章:
计算机网络基础: 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)
http请求类型和状态码:常见网络通信协议(http、https、ws)及安全协议(SSL、TLS、XTLS)
请求方法 | 描述 |
---|---|
GET | 用于从服务器获取数据。 |
POST | 用于向服务器提交数据,通常用于创建新资源。 |
PUT | 用于向服务器更新或替换指定资源或创建新资源。 |
DELETE | 用于请求服务器删除指定资源。 |
HEAD | 与 GET 方法类似,但只请求获取响应头信息,不包括实际数据。 |
PATCH | 用于部分更新服务器上的资源。 |
OPTIONS | 用于获取服务器支持的请求方法列表,通常用于跨域请求预检。 |
CONNECT | 用于建立网络连接,通常由代理服务器使用。 |
TRACE | 用于在路径上对消息进行跟踪,通常用于诊断和调试。 |
状态码:200、401、404、404、500、503等是常见的。
URI(Uniform Resource Identifier):
- URI 是一个更广泛的概念,用于标识资源。
- 它包括了 URL 和 URN(Uniform Resource Name)。
- URI 可以提供资源的位置(URL)或名称(URN)。
URL(Uniform Resource Locator):
- URL 是 URI 的一个子集,专门用于标识资源的位置。
- 它提供了资源在互联网上的具体地址,允许用户通过网络访问该资源。
- URL 通常包括协议(如 http、https)、域名、路径和可能的查询字符串。
二、Requests库详解
Requests
是一个简单易用的HTTP库,广泛用于Python中发送HTTP请求。它可以处理GET、POST、PUT、DELETE等请求,支持会话、文件上传、HTTP头设置等功能,适用于各种网络交互场景。
是常用的第三方库,python标准库是urllib
。
2.1 requests 库源码简要解读
通常我们会这样使用requests库:
import requests
r = requests.get(r'https://www.baidu.com')
print(r.status_code)
print(r.text)
直接使用get函数来执行一个GET请求。
get()
函数定义在requests库的api.py
文件中,这个文件还定义了其他几个常用http请求类型的函数。
get()
函数或者post()
等函数,并没有直接实现功能,而是调用了request()
函数,如:
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request("get", url, params=params, **kwargs)
而request()
函数也没有直接完成具体功能:
def request(method, url, **kwargs):
with sessions.Session() as session:
return session.request(method=method, url=url, **kwargs)
api.py
中的request()
函数,创建了sessions.py
文件中的Session()
类的对象,再调用request()
方法(sessions.py中Session类的方法)来完成一个http请求。
这里使用with
语句,确保在使用后自动关闭。这样可以保持与服务器的连接,并在会话结束时释放资源。
即我们通常使用的requests.get()、requests.post()等都是封装后的函数,更加简洁、直观。
Session.request()的具体执行逻辑就不展开了,包括参数处理、请求的构建、连接和发送、接收响应、构建响应对象等内容,可以自己阅读
sessions.py
。你会发现它最终使用了urllib3(一个更高级的库,基于urllib)。
2.2 参数解读
这里就解读一下api.py
中request()
函数的参数,这些参数是各种常见http请求的可选参数。每种具体的请求get、put等,由于功能不同,可能不完全支持所有类型参数。
下表是request()
函数的参数,使用封装后的函数如get()、post()的时候,就不必指定method和url,这些函数的名称就是请求的method、第一个参数就是url。
使用get()
函数发送GET请求:
response = requests.get(
'https://blog.csdn.net/community/home-api/v1/get-business-list',
params=params,
cookies=cookies,
headers=headers,
)
使用requst()
函数发送GET请求:
response = requests.request(
method='get',
url='https://blog.csdn.net/community/home-api/v1/get-business-list',
params=params,
cookies=cookies,
headers=headers,
)
参数 | 类型 | 描述 |
---|---|---|
method | 字符串 | 新的Request 对象的方法:GET 、OPTIONS 、HEAD 、POST 、PUT 、PATCH 或DELETE 。 |
url | 字符串 | 新的Request 对象的URL。 |
params | 可选,字典/元组/字节 | 要发送的查询字符串,可以是字典、元组列表或字节。 |
data | 可选,字典/元组/字节/文件 | 要发送在请求体中的数据,可以是字典、元组列表、字节或类文件对象。 |
json | 可选,Python对象 | 要发送在请求体中的可JSON序列化的Python对象。 |
headers | 可选,字典 | 与请求一起发送的HTTP头部字典。 |
cookies | 可选,字典或CookieJar | 与请求一起发送的cookie字典或CookieJar对象。 |
files | 可选,字典 | 用于多部分编码上传的文件字典,格式为'name': file-like-objects 或{'name': file-tuple} 。 |
auth | 可选,元组 | 启用基本/摘要/自定义HTTP认证的认证元组。 |
timeout | 可选,浮点数或元组 | 服务器发送数据之前等待的秒数,浮点数或(connect timeout, read timeout) 元组。 |
allow_redirects | 可选,布尔值 | 启用/禁用GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD重定向,默认值为True 。 |
proxies | 可选,字典 | 协议到代理URL的映射字典。 |
verify | 可选,布尔值或字符串 | 控制是否验证服务器的TLS证书,布尔值为True ,字符串为CA包的路径。默认值为True 。 |
stream | 可选,布尔值 | 如果为False ,则响应内容将立即下载。 |
cert | 可选,字符串或元组 | 如果是字符串,表示ssl客户端证书文件的路径(.pem)。如果是元组,则为('cert', 'key') 对。 |
return | Response 对象 | 返回Response 对象。 |
rtype | requests.Response | 返回类型。 |
常用的参数有:
- method;
- url;
- headers;
- cookies;
- params;
- data。
2.3 处理响应
(1)响应状态码
可以通过status_code
获取响应状态码,以判断请求是否成功。
if response.status_code == 200:
print('请求成功!')
else:
print(f'请求失败,状态码:{response.status_code}')
(2)响应内容
响应内容可以是文本、JSON、字节等格式。
# 获取文本
text_content = response.text
# 获取JSON
json_content = response.json()
# 获取原始字节
binary_content = response.content
这些内容,通常还会进一步提取所需对象。
2.4 错误处理
requests库提供异常处理,可以通过捕获requests.exceptions
中的异常进行处理。
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status() # 如果响应状态码是错误,抛出异常
except requests.exceptions.HTTPError as err:
print(f'HTTP错误:{err}')
except requests.exceptions.RequestException as err:
print(f'请求错误:{err}')