在Python开发中,发送HTTP请求是非常常见的操作,无论是调用开放API、爬取网页内容,还是实现微服务之间的通信,都需要用到对应的网络请求库。不同的库设计理念不同,适用的场景也存在明显差异,了解它们的特点才能做出合适的选择。

常用Python HTTP请求库介绍
1. urllib
urllib是Python标准库自带的网络请求模块,不需要额外安装,兼容性极强,所有Python环境都可以直接使用。它包含多个子模块,其中urllib.request用于发送请求,urllib.parse用于处理URL参数,urllib.error用于处理请求异常。
发送GET请求的基础示例如下:
import urllib.request
import urllib.parse
# 发送GET请求
url = "http://ipipp.com/api/test"
response = urllib.request.urlopen(url)
# 读取响应内容,需要解码为字符串
content = response.read().decode("utf-8")
print(content)
# 发送带参数的GET请求
params = {"name": "test", "page": 1}
encoded_params = urllib.parse.urlencode(params)
full_url = f"{url}?{encoded_params}"
response = urllib.request.urlopen(full_url)
print(response.read().decode("utf-8"))
2. requests
requests是第三方库中最流行的HTTP请求工具,它的设计非常人性化,API简洁直观,支持自动处理编码、会话保持、文件上传、SSL验证等常见功能,大大降低了发送请求的复杂度,是目前大多数Python开发者的首选库。
使用前需要先安装:pip install requests,发送GET和POST请求的示例如下:
import requests
# 发送GET请求
response = requests.get("http://ipipp.com/api/test")
print(response.status_code) # 响应状态码
print(response.text) # 响应文本内容
# 发送带参数的GET请求
params = {"name": "test", "page": 1}
response = requests.get("http://ipipp.com/api/test", params=params)
print(response.json()) # 直接解析JSON响应
# 发送POST请求,传递表单数据
data = {"username": "admin", "password": "123456"}
response = requests.post("http://ipipp.com/api/login", data=data)
print(response.text)
# 发送POST请求,传递JSON数据
json_data = {"id": 1, "content": "测试内容"}
response = requests.post("http://ipipp.com/api/submit", json=json_data)
print(response.text)
3. aiohttp
aiohttp是基于asyncio的异步HTTP请求库,支持异步发送请求和处理响应,适合需要高并发请求的场景,比如批量爬取数据、同时调用多个第三方接口等,能够大幅提升请求效率,减少等待时间。
使用前需要安装:pip install aiohttp,异步请求示例如下:
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
url = "http://ipipp.com/api/test"
# 并发发送多个请求
tasks = [fetch(url) for _ in range(5)]
results = await asyncio.gather(*tasks)
for res in results:
print(res)
if __name__ == "__main__":
asyncio.run(main())
4. httpx
httpx是较新的HTTP请求库,同时支持同步和异步请求,兼容requests的API设计,还支持HTTP/2协议,功能更加全面,适合需要兼顾易用性和新特性的场景。
安装命令:pip install httpx,同步和异步请求示例如下:
import httpx
import asyncio
# 同步请求
response = httpx.get("http://ipipp.com/api/test")
print(response.text)
# 异步请求
async def async_fetch():
async with httpx.AsyncClient() as client:
response = await client.get("http://ipipp.com/api/test")
print(response.text)
asyncio.run(async_fetch())
各库核心特性对比
以下是几个常用库的核心维度对比:
| 库名称 | 是否标准库 | 是否支持异步 | 使用难度 | 性能表现 | 适用场景 |
|---|---|---|---|---|---|
| urllib | 是 | 否 | 较高 | 一般 | 无第三方库依赖的环境、简单请求场景 |
| requests | 否 | 否 | 低 | 一般 | 大多数常规请求场景、快速开发 |
| aiohttp | 否 | 是 | 中等 | 高 | 高并发请求场景、异步项目 |
| httpx | 否 | 是 | 低 | 较高 | 需要同步异步兼容、HTTP/2支持的场景 |
如何选择适合的请求库
选择请求库时可以参考以下原则:
- 如果项目环境不允许安装第三方库,或者只需要发送非常简单的请求,优先选择urllib。
- 如果是常规的业务开发,不需要高并发,优先选择requests,它的生态完善,遇到问题容易找到解决方案。
- 如果需要发送大量并发请求,比如爬虫批量采集数据,优先选择aiohttp,异步特性可以大幅提升效率。
- 如果项目本身是异步架构,或者需要支持HTTP/2协议,httpx是更好的选择,它同时兼容同步和异步的使用方式。
注意事项
发送HTTP请求时需要注意以下几点:
- 请求第三方接口时要注意频率限制,避免被对方封禁IP。
- 处理响应时要做好异常捕获,比如网络超时、连接失败、响应状态码异常等情况。
- 如果请求需要携带认证信息,比如Token、Cookie,要选择合适的传递方式,避免信息泄露。
- 生产环境中建议设置合理的请求超时时间,避免长时间等待影响程序运行。
发送HTTP请求是Python开发的基础能力,选择合适的库可以提升开发效率,也能让程序运行更稳定。建议新手先从requests入手,熟悉基本请求逻辑后再根据场景学习其他库的使用。