4.1 处理响应
模块 requests 提供了方便的方法来处理服务器的响应。
状态码
除了响应外,服务器还会发送请求处理的状态。 状态信息包含在字段 status_code 和 reason 中。下面是一个示例:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # 输出响应的状态码
print(response.reason) # 输出状态的文本描述
print(response.ok) # 如果状态码小于400则返回True
标题
当然,哪有 HTTP 请求是没有标题的呢?如果你需要请求或响应的标题,可以通过字段 headers 来访问:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # 输出响应的标题
print(response.headers['Content-Type']) # 输出特定标题的值
响应主体
服务器的响应可能包含字节集、文本、json 或 xml。如果你知道你请求服务器的内容是什么, 可以使用其中一个方法/字段直接获取需要的对象类型:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # 输出响应的文本
print(response.json()) # 以JSON格式输出响应体
print(response.content) # 以字节格式输出响应体
更多关于标题 (headers) 和响应状态的细节你将在网络架构的讲座中了解到。
4.2 处理错误
模块 requests 提供了用于错误处理的异常。
HTTP 标准不包含异常,相反它使用错误代码 (status_code)。如果你希望在请求失败时产生一个 Python 异常, 你需要显式调用 函数 raise_for_status()。
示例:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # 为4xx和5xx状态码生成异常
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("Success!")
更多关于错误代码的细节你可以在网络架构的讲座中了解。
4.3 发送数据
在 JSON 发明之前,大量数据是通过“表单”发送的。表单是浏览器页面的一个特殊对象(以及 HTTP 数据标准)。 如果你想通过“表单”发送数据,只需在请求中传递参数 data。
注意! GET 请求不支持表单,因为它们不包含请求主体。所有数据仅在 URL 中传递。
在 GET请求 中发送数据
在 GET请求 中,数据通过 URL 参数传递。以下是一个示例:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # 输出带参数的URL
发送表单数据
我们会使用 POST请求 向服务器发送数据。
示例:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
发送文件
如果你想在互联网上传输二进制数据,比如上传图片,你需要通过参数 files 在请求中传递你的文件或文件们。
示例:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
就像一加一一样简单。如果你想发送多个文件,只需在 files 变量中以任意名称列出它们。
注意! 不要忘记在发送后关闭文件以避免资源泄漏。最好使用 with 结构,它会在操作完成后自动关闭文件:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 登录和授权
API(应用程序编程接口)是一套允许不同程序互相交互的规则和协议。很多网站和服务都只允许在登录后发送请求并与其 API 一起工作。
成功登录后,你会获得一个特殊的对象——会话 (session),它包含你与服务器“授权会话”的唯一编号。对于后续的请求,你需要使用这个对象。
认证
为了登录服务器,需要进行认证(登录过程),这需要在请求中传递凭据。
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
这就是授权过程,但通常它与会话一起使用。
使用会话
会话允许在请求之间保存参数,如 cookies 或用户授权信息。
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# 创建会话
session = requests.Session()
# 登录网站
login_response = session.post('https://example.com/login', data = payload)
# 登录用户的会话后续操作
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION