网络请求与数据获取:Requests 库的使用与技巧
在现代 Web 开发与数据科学工作中,从 API、网页或服务端获取数据是非常常见的任务,而 Python 的 Requests
库为此提供了便捷且功能强大的工具。本文将从基本的 HTTP 请求操作出发,结合常见的数据获取需求,深入讲解 Requests
的使用技巧,让您更高效地实现网络数据获取任务。
一、Requests 库简介
Requests
是 Python 中广泛使用的 HTTP 请求库之一,它的设计哲学是简单优雅,让开发者能够快速发起 HTTP 请求。通过 Requests
,您可以轻松地发送 GET、POST、PUT、DELETE 等请求,并获得结构化的响应数据。
安装 Requests
在使用 Requests
之前,需要通过以下命令进行安装:
pip install requests
二、基础用法
1. 发送 GET 请求
最基本的请求是 GET 请求,用于从服务器获取数据。通过 requests.get()
可以直接发送 GET 请求并获取响应内容。
import requests
url = 'https://jsonplaceholder.typicode.com/posts'
response = requests.get(url)
# 打印响应状态码
print(response.status_code)
# 打印返回的 JSON 数据
print(response.json())
response.status_code
:返回响应的状态码,200 表示成功,404 表示未找到等。response.json()
:将 JSON 响应转换为 Python 字典。
2. 发送 POST 请求
POST 请求一般用于提交数据。通过 requests.post()
可以传入数据发送 POST 请求。
data = {'title': 'foo', 'body': 'bar', 'userId': 1}
response = requests.post(url, json=data)
print(response.status_code)
print(response.json())
三、请求参数与 Headers 设置
在真实应用中,HTTP 请求往往需要带有请求参数或自定义的请求头,Requests
提供了便捷的方法来实现。
1. URL 请求参数
在 GET 请求中,可以通过 params
参数传递查询参数,Requests
会自动将其编码为 URL 的查询字符串。
params = {'userId': 1}
response = requests.get(url, params=params)
print(response.url) # https://jsonplaceholder.typicode.com/posts?userId=1
print(response.json())
2. 请求 Headers
通过 headers
参数设置自定义的请求头,例如伪装成浏览器或指定 API 的认证密钥。
headers = {'User-Agent': 'Mozilla/5.0', 'Authorization': 'Bearer YOUR_API_TOKEN'}
response = requests.get(url, headers=headers)
print(response.json())
3. 发送带有 Cookie 的请求
如果需要登录或保持会话,可以使用 cookies
参数来传递 Cookie。
cookies = {'session_id': '123456789'}
response = requests.get(url, cookies=cookies)
print(response.json())
四、文件上传与下载
1. 文件上传
通过 POST 请求上传文件,可以使用 files
参数。
file_path = 'path/to/your/file.txt'
files = {'file': open(file_path, 'rb')}
response = requests.post(url, files=files)
print(response.status_code)
print(response.json())
2. 文件下载
获取文件数据并将其保存到本地文件,适用于下载图片、PDF 文件等。
file_url = 'https://example.com/image.jpg'
response = requests.get(file_url)
with open('downloaded_image.jpg', 'wb') as file:
file.write(response.content)
response.content
返回字节内容,可以直接写入二进制文件。
五、处理超时和重试
网络请求中经常会遇到超时或连接失败等问题。Requests
提供了超时参数 timeout
和重试机制来更好地处理这些情况。
1. 设置请求超时
设置 timeout
可以避免请求长时间挂起,timeout
参数接受秒数作为值:
try:
response = requests.get(url, timeout=5)
print(response.json())
except requests.exceptions.Timeout:
print("请求超时,请检查网络或服务状态")
2. 使用重试机制
在一些网络不稳定或服务偶尔会失败的情况下,可以使用 requests.adapters.HTTPAdapter
配合 Retry
实现自动重试。
from requests.adapters import HTTPAdapter, Retry
session = requests.Session()
retries = Retry(total=5, backoff_factor=0.2, status_forcelist=[500, 502, 503, 504])
session.mount('http://', HTTPAdapter(max_retries=retries))
response = session.get(url)
print(response.status_code)
total=5
:重试次数为 5 次。backoff_factor=0.2
:重试间隔时间倍增,形成指数退避。status_forcelist
:设置哪些 HTTP 状态码触发重试。
六、Session 会话保持
Requests
提供了 Session
对象,可以保持会话状态,比如自动保存并携带 Cookie 以实现登录后连续访问。
session = requests.Session()
# 第一次请求登录,保存登录后的 Cookie
login_data = {'username': 'user', 'password': 'pass'}
session.post('https://example.com/login', data=login_data)
# 第二次请求访问需要登录的页面
response = session.get('https://example.com/dashboard')
print(response.json())
使用 Session
后,第二次请求会自动携带登录后的 Cookie 和会话信息,便于后续访问。
七、SSL 证书验证与代理设置
1. 忽略 SSL 证书验证
在请求 HTTPS 时,可以通过 verify=False
忽略 SSL 证书,适用于本地测试或不需要验证证书的场景:
response = requests.get(url, verify=False)
⚠️ 注意:忽略 SSL 证书存在安全风险,不推荐在生产环境使用。
2. 设置代理
通过代理访问网络,适用于网络封锁、限流等场景。
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'https://10.10.1.10:1080',
}
response = requests.get(url, proxies=proxies)
print(response.json())
八、处理复杂 JSON 响应
当接口返回的 JSON 数据较为复杂时,可以使用 Python 的字典和列表操作对其进行解析。
response = requests.get(url)
data = response.json()
# 假设 data 是一个包含嵌套数据的字典
for item in data['items']:
print(f"ID: {item['id']}, Name: {item['name']}")
在处理复杂数据时,熟练掌握字典和列表的解析方法,可以有效提取有用信息。
总结
Requests
是一个功能强大且简单易用的 HTTP 请求库,在数据获取与接口请求中提供了极大的便利。本文介绍了 Requests 的基础操作和多种高级用法,包括请求参数、文件处理、超时重试、会话保持等技巧,能够帮助您轻松应对不同的网络请求场景。在掌握这些内容后,您就可以利用 Requests
库高效地获取和处理网络数据,为开发自动化数据采集、接口调用等任务提供支持。