Python库之requests
的高级用法深度解析
在Python中,requests
库是一个发送HTTP请求的强大工具。本文将深入探讨requests
的高级用法,包括流式上传、多部分文件上传、会话管理、代理设置、HTTPS请求、请求重试、连接超时、自定义请求头、自定义请求体、使用会话保持Cookies、同步与异步请求、以及如何处理请求和响应的Cookies等。
一、流式上传大文件
详细解释:
流式上传是一种高效的文件传输方式,特别适合处理大文件。它允许应用程序发送文件的一部分,而不是整个文件一次性加载到内存中。在requests
库中,你可以通过打开文件的流,并将其作为参数传递给post
方法来实现流式上传。
import requests
with open('largefile.zip', 'rb') as f:
response = requests.post('https://www.example.com/upload', data={'file': f})
二、多部分文件上传
详细解释:
多部分MIME类型用于上传具有多个部分的请求体,通常用于文件上传,但也可以用于表单数据。在requests
中,当你使用files
参数时,库会自动处理多部分请求体的构建。这使得你可以同时上传多个文件和表单字段。
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel')}
response = requests.post('https://www.example.com/upload', files=files)
三、会话管理
详细解释:
Session
对象允许你跨多个请求保持某些参数,例如Cookies、Headers等。这在需要维持用户状态的场景中非常有用,如用户登录后进行的一系列操作。
s = requests.Session()
s.get('https://www.example.com/login', params={'user': 'user', 'pass': 'pass'})
s.post('https://www.example.com/submit', data={'key': 'value'})
四、代理设置
详细解释:
有时候,出于安全或网络架构的原因,你可能需要通过一个或多个代理服务器来发送HTTP请求。requests
库的proxies
参数允许你指定代理服务器的详细信息,包括HTTP和HTTPS的代理。
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.11:1080',
}
response = requests.get('https://www.example.com', proxies=proxies)
五、HTTPS请求
详细解释:
requests
库对HTTPS请求提供了原生支持。这意味着你可以像发送HTTP请求一样发送HTTPS请求。此外,verify
参数允许你控制SSL证书的验证行为,这在测试环境中可能有用,但在生产环境中出于安全考虑,不建议禁用。
response = requests.get('https://www.example.com', verify=False)
六、请求重试
详细解释:
网络请求可能会因为各种原因失败,如网络波动或服务器暂时不可用。requests
库结合urllib3
的Retry
类可以实现请求的自动重试逻辑,这有助于提高程序的鲁棒性。
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from requests import Session
s = Session()
retries = Retry(total=3, backoff_factor=1, status_forcelist=[502, 503, 504])
s.mount('https://', HTTPAdapter(max_retries=retries))
response = s.get('https://www.example.com')
七、连接超时
详细解释:
timeout
参数允许你为请求设置一个超时时间。如果请求在这个时间内没有完成,requests
库将抛出一个异常。这个特性对于避免无限等待无响应的服务器非常有用。
response = requests.get('https://www.example.com', timeout=5)
八、自定义请求头
详细解释:
HTTP请求头可以携带额外的信息,如用户代理、认证信息、内容类型等。在requests
中,你可以通过headers
参数自定义这些请求头。
headers = {
'User-Agent': 'Mozilla/5.0',
'Accept-Language': 'en-US,en;q=0.5',
}
response = requests.get('https://www.example.com', headers=headers)
九、自定义请求体
详细解释:
除了表单数据和文件,requests
还允许你发送自定义的请求体,比如JSON格式的数据。这在使用API时特别有用,因为许多API都要求使用JSON格式。
import json
data = {
'key1': 'value1',
'key2': 'value2',
}
response = requests.post('https://www.example.com/submit', data=json.dumps(data), headers={'Content-Type': 'application/json'})
十、使用会话保持Cookies
详细解释:
Cookies是维护状态的一种机制,requests
的Session
对象可以自动处理Cookies,使得在同一个会话中的多个请求之间保持状态,这对于模拟具有持久登录状态的用户的浏览行为非常有用。
s = requests.Session()
s.get('https://www.example.com/login', params={'user': 'user', 'pass': 'pass'})
s.get('https://www.example.com/profile')
十一、同步与异步请求
详细解释:
虽然requests
本身是同步的,但你可以使用asyncio
和aiohttp
等库来实现异步请求。这对于I/O密集型或高并发的应用场景非常有用,可以提高程序的整体性能。
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'https://www.example.com')
print(html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
十二、处理请求和响应的Cookies
详细解释:
requests
库允许你发送带有Cookies的请求,并且可以访问响应中的Cookies。这对于处理需要Cookies验证的请求或需要在请求之间保持Cookies的场景非常重要。
cookies = {'cookie_name': 'cookie_value'}
response = requests.get('https://www.example.com', cookies=cookies)
print(response.cookies)
十三、使用会话进行持久连接
详细解释:
HTTP持久连接,也称为HTTP keep-alive,允许多个请求复用同一个TCP连接,减少了建立和关闭连接的开销。requests
的Session
对象可以维持一个HTTP连接池,从而实现持久连接。
with requests.Session() as session:
session.get('https://www.example.com')
session.post('https://www.example.com/submit', data={'key': 'value'})
十四、状态码处理
详细解释:
HTTP响应状态码提供了请求结果的重要信息。requests
库的status_code
属性允许你检查响应的状态码,并据此做出相应的处理。
response = requests.get('https://www.example.com')
if response.status_code == 200:
print('请求成功')
elif response.status_code == 404:
print('页面未找到')
else:
print('请求出错')
十五、流式响应
详细解释:
流式响应允许你逐步处理响应的内容,而不是一次性将整个响应加载到内存中。这对于处理大文件或节省内存非常有用。
response = requests.get('https://www.example.com/largefile.zip', stream=True)
for chunk in response.iter_content(chunk_size=1024):
if chunk: # 过滤掉保持连接的chunk
with open('largefile.zip', "ab") as f:
f.write(chunk)
十六、总结
本文详细介绍了requests
库的高级用法,涵盖了从流式上传、多部分文件上传到会话管理、代理设置、HTTPS请求、请求重试、连接超时、自定义请求头、自定义请求体、使用会话保持Cookies、同步与异步请求、以及如何处理请求和响应的Cookies等多个方面。这些高级用法可以帮助开发者更加灵活和高效地使用requests
库来处理各种HTTP请求。
requests
库的功能非常强大,本文只是介绍了其中的一部分。如果你对requests
库有更深入的需求,或者想要了解更多高级用法,可以访问requests
官方文档,获取更多信息。此外,requests
库的作者Kenneth Reitz撰写了一本名为《Requests: HTTP for Humans》的书籍,深入讲解了requests
库的使用方法,也是学习requests
库的一个很好的资源。