Python的 requests
库是一种广泛使用的HTTP客户端库,它允许你发送HTTP/1.1请求易如反掌。它的设计目标是使HTTP请求对开发者来说尽可能得简单快捷。requests
库遵循RFC 7231的HTTP协议标准,并提供了多种功能,比如会话对象、持久连接和请求钩子。
安装
你可以使用 pip
安装 requests
库:
pip install requests
创建请求
发送请求最简单的方式是直接使用 requests.get
或 requests.post
等函数:
import requests
response = requests.get('https://api.example.com/data')
requests
同样支持其他HTTP方法,如 HEAD
、PUT
、DELETE
、PATCH
和 OPTIONS
。
请求参数
发送GET请求时,可以使用 params
关键字参数来提供URL参数:
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=payload)
对于POST请求,可以使用 data
关键字参数来提供表单数据:
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("https://api.example.com/post", data=payload)
请求头部
请求的头部可以通过一个字典传递给 headers
参数:
headers = {'user-agent': 'my-app/0.0.1'}
response = requests.get('https://api.example.com/data', headers=headers)
JSON请求
requests
可以很方便的处理JSON类型的请求,通过简单地传递一个字典给 json
参数,它会自动被转换成JSON:
response = requests.post('https://api.example.com/data', json={"my": "data"})
响应内容
响应的内容可以通过 response.text
来访问,这会返回一个Unicode形式的响应文本。为了获取字节形式的响应体,你可以访问 response.content
。
print(response.text)
如果响应是JSON格式,可以直接用 response.json()
方法来解析:
print(response.json())
错误处理
requests
可以通过 response.raise_for_status()
来抛出异常,当遇到网络问题(例如:DNS查询失败、拒绝连接等)或失效的HTTP响应时。
try:response.raise_for_status()
except requests.exceptions.HTTPError as err:print(err)
超时
你可以告诉 requests
库,它应该等待多久连接和读取数据的超时时间。
response = requests.get('https://api.example.com/data', timeout=1)
这里的超时时间是秒为单位。
会话对象
为了同一站点上的多个请求维护一些持久化的连接,你可以使用会话对象。会话对象也可以跨请求保持某些参数。
with requests.Session() as session:session.headers.update({'x-test': 'true'})response = session.get('https://httpbin.org/headers', headers={'x-test2': 'false'})
会话还可以用于持久化某些参数,如cookies。
安全和身份验证
requests
支持多种身份验证形式,最简单的是HTTP基本认证:
from requests.auth import HTTPBasicAuth
response = requests.get('https://api.example.com/data', auth=HTTPBasicAuth('user', 'pass'))
同时也支持摘要认证、OAuth认证等。
SSL证书验证
默认情况下,requests
会验证HTTPS请求的SSL证书,如果证书验证失败,它会抛出一个 SSLError
。你可以通过设置 verify=False
来忽略SSL证书验证,但这通常是不推荐的,因为它会降低安全性。
response = requests.get('https://api.example.com/data', verify=False)