1. Python requests 模块介绍
Python requests 模块是一个第三方的 HTTP 库,用于向 Web 服务器发送 HTTP 请求。它是 Python 标准库中 urllib 的优雅封装。
requests 模块的特点有:
基于 HTTP 协议,支持 GET、POST、PUT、DELETE 等常用的请求方式。
完美支持 HTTP/1.0 和 HTTP/1.1。
自动处理 cookie。
支持 SSL/TLS。
提供了丰富的请求头和响应头信息。
支持上传和下载文件。
支持会话(Session)和连接池(Connection Pool)功能。
requests 模块安装命令:
pip install requests
2. 发送 GET 请求
发送 GET 请求可以使用 requests.get 方法。
2.1 基本用法
import requests
url = 'https://api.github.com'
response = requests.get(url)
print(response.status_code)
print(response.text)
以上代码使用 requests.get 方法向 Github API 发出了一个 GET 请求,获取了 Github API 的响应,其中 status_code 属性的值为响应的状态码,text 属性的值为响应的文本内容。
2.2 带参数的 GET 请求
在发送 GET 请求时可以使用 params 参数向 URL 中添加查询参数。
import requests
url = 'https://api.github.com/search/repositories'
params = {'q': 'python'}
response = requests.get(url, params=params)
print(response.status_code)
print(response.json())
以上代码使用 params 参数向 Github API 的搜索接口添加了查询参数 q=python,获取了查询结果的响应,其中 json() 方法将响应的 JSON 字符串解码成 Python 字典。
3. 发送 POST 请求
发送 POST 请求可以使用 requests.post 方法。
3.1 基本用法
import requests
url = 'https://httpbin.org/post'
data = {'name': 'Tom', 'age': 18}
response = requests.post(url, data=data)
print(response.status_code)
print(response.text)
以上代码使用 data 参数对请求体进行了编码,并发送了一个 POST 请求,其中 url 是请求的 URL,data 是请求体的内容,response 是响应的对象。
3.2 带文件的 POST 请求
在发送 POST 请求时可以使用 files 参数向请求体中添加文件。
import requests
url = 'https://httpbin.org/post'
files = {'file': open('example.txt', 'rb')}
response = requests.post(url, files=files)
print(response.status_code)
print(response.text)
以上代码使用 files 参数向请求体中添加了一个名为 file 的文件对象,发送了一个 POST 请求。
4. 请求头和响应头
requests 模块支持自定义请求头和获取响应头。
4.1 自定义请求头
在发送请求时可以使用 headers 参数向请求中添加自定义请求头。
import requests
url = 'https://api.github.com'
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.headers)
以上代码使用 headers 参数向请求中添加了一个 User-Agent 请求头,发送了一个 GET 请求,并获取了响应的头信息。
4.2 获取响应头
在获取响应时可以使用 headers 属性获取响应头。
import requests
url = 'https://api.github.com'
response = requests.get(url)
print(response.status_code)
print(response.headers['Content-Type'])
以上代码获取了响应头中的 Content-Type 属性。
5. 处理异常
在发送请求时可能会发生一些异常,例如网络连接异常、请求超时等。requests 模块内置了一些异常类型,可以用于处理这些异常。
5.1 网络连接异常
可以使用 requests.exceptions.ConnectionError 类捕获网络连接异常。
import requests
try:
response = requests.get('https://www.google.com/404')
response.raise_for_status()
except requests.exceptions.ConnectionError as e:
print(e)
except requests.exceptions.HTTPError as e:
print(e)
以上代码使用 raise_for_status() 方法判断响应是否出错,如果出错则会引发 HTTPError 异常。
5.2 请求超时异常
可以使用 requests.exceptions.Timeout 类捕获请求超时异常。
import requests
try:
response = requests.get('https://www.google.com/', timeout=0.1)
except requests.exceptions.Timeout as e:
print(e)
以上代码使用 timeout 参数设置请求超时时间为 0.1 秒。
6. 会话(Session)和连接池(Connection Pool)
requests 模块支持会话(Session)和连接池(Connection Pool)两种功能。
6.1 会话(Session)
可以使用 requests.Session 类创建一个会话,可以在一系列请求中共享数据,例如 cookie、HTTP 头信息等。
import requests
session = requests.Session()
session.get('https://httpbin.org/cookies/set?name=value')
response = session.get('https://httpbin.org/cookies')
print(response.status_code)
print(response.json())
以上代码创建了一个会话,并在该会话中发送了两个 GET 请求,第一个请求设置了 cookie,第二个请求获取了 cookie。
6.2 连接池(Connection Pool)
可以使用 requests.adapters.HTTPAdapter 类创建一个连接池,可以复用已经建立的连接,从而提高性能。
import requests
session = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
session.mount('http://', adapter)
response = session.get('http://www.baidu.com')
print(response.status_code)
以上代码使用 HTTPAdapter 类创建了一个连接池,设置了最大连接数和最大连接数限制,并将其与会话进行绑定,实现了连接复用的功能。