文章目录

只用十行代码,他让HTTP请求比喝水还简单
第一部分 背景——为什么你需要它
在 Python 世界里,只要你想“上网”——拉天气、调支付、爬图片、连 AI 接口——就绕不开 HTTP。
然而原生的 urllib
像一把瑞士军刀:功能全,却刀刀硌手。于是,requests
出现了。
它把繁琐的底层细节藏进优雅的 API,让你用写本地文件的方式写网络请求。
接下来,我们就从“它是什么”讲到“它能做什么”,再到“踩坑怎么办”。
第二部分 它到底是什么
requests
是 Kenneth Reitz 开源的第三方 HTTP 客户端库,口号只有一个词:HTTP for Humans。
它基于 urllib3
,但提供了更高层、更 Pythonic 的接口,覆盖了所有主流 HTTP 动词(GET、POST、PUT、DELETE…)与特性(Cookie、Session、SSL、代理、流式下载等)。
第三部分 安装——一行命令即可
pip install requests
国内镜像加速(可选):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
第四部分 5 个最常用的 API,逐行拆解
# | 需求 | 代码 | 逐行说明 |
---|---|---|---|
1 | 发 GET,取网页 | r = requests.get('https://httpbin.org/get') | 发起 GET,返回 Response 对象 |
print(r.status_code) | 200 表示成功 | ||
print(r.text[:100]) | 取前 100 字符看看内容 | ||
2 | 带查询参数 | payload = {'key1': 'val1', 'key2': 'val2'} | 构造查询字典 |
r = requests.get('https://httpbin.org/get', params=payload) | 自动把字典拼到 URL | ||
print(r.url) | 验证最终 URL | ||
3 | 发 POST,交 JSON | data = {'name': 'Alice', 'age': 18} | 准备 JSON 数据 |
r = requests.post('https://httpbin.org/post', json=data) | json= 自动序列化并加头 Content-Type: application/json | ||
print(r.json()['json']) | 服务器原样返回的 JSON | ||
4 | 下载二进制文件 | url = 'https://httpbin.org/image/png' | 示例图片 |
r = requests.get(url, stream=True) | stream=True 边下边存,不占内存 | ||
with open('demo.png', 'wb') as f: | 以二进制写文件 | ||
for chunk in r.iter_content(1024): | 每 1 KB 写入一次 | ||
f.write(chunk) | 保存到本地 | ||
5 | 自动保持 Cookie 的 Session | s = requests.Session() | 创建 Session 对象 |
s.get('https://httpbin.org/cookies/set?token=abc123') | 第一次请求设置 Cookie | ||
r = s.get('https://httpbin.org/cookies') | 第二次请求自动带上 Cookie | ||
print(r.json()) | 能看到 token=abc123 |
第五部分 5 个真实场景,代码实战
1. 天气查询 CLI
import requests, sys
city = sys.argv[1] # ① 命令行读城市
key = '你的高德Key' # ② 去高德开放平台申请
url = 'https://restapi.amap.com/v3/weather/weatherInfo'
params = {'key': key, 'city': city}
r = requests.get(url, params=params) # ③ 发 GET
r.raise_for_status() # ④ 非 200 抛异常
data = r.json() # ⑤ 解析 JSON
print(data['lives'][0]['weather']) # ⑥ 打印天气
2. 一行代码上传文件到图床
files = {'smfile': open('cat.jpg', 'rb')} # ① 构造 multipart/form-data
r = requests.post('https://sm.ms/api/v2/upload',
files=files,
headers={'Authorization': '你的Token'})
print(r.json()['data']['url']) # ② 得到外链
3. 钉钉群机器人告警
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
msg = {"msgtype": "text", "text": {"content": "服务器挂了!"}}
r = requests.post(webhook, json=msg) # 直接发 JSON
print(r.json()['errmsg']) # 成功返回 "ok"
4. 带 Basic Auth 拉私有仓库
from getpass import getpass
user = input('GitHub用户名: ')
pwd = getpass('密码或Token: ')
url = 'https://api.github.com/user/repos'
r = requests.get(url, auth=(user, pwd)) # auth=() 自动加头
print([repo['full_name'] for repo in r.json()][:5])
5. 并发加速下载 100 张图片
import requests, concurrent.futures, os
urls = [f'https://picsum.photos/200/300?random={i}' for i in range(100)]
def fetch(u):
return requests.get(u).content
os.makedirs('imgs', exist_ok=True)
with concurrent.futures.ThreadPoolExecutor(20) as ex:
for i, data in enumerate(ex.map(fetch, urls)):
open(f'imgs/{i}.jpg', 'wb').write(data)
print('全部下载完成')
第六部分 常见 3 个坑 + 解决方案
# | Bug 场景 | 错误信息 | 最小复现代码 & 修复 |
---|---|---|---|
1 | SSL 证书验证失败 | SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] | requests.get('https://self-signed.badssl.com') → 修复:加 verify=False 或安装证书 |
2 | 忘记设置超时导致程序卡死 | 无报错,一直阻塞 | requests.get('https://httpbin.org/delay/10') → 修复:requests.get(url, timeout=5) |
3 | 编码错乱出现 �� | 'gbk' codec can't encode character | r = requests.get('https://httpbin.org/html') r.text 乱码 → 修复:先 r.encoding = r.apparent_encoding 再 .text |
第七部分 总结——把网络请求变成本地操作
- 简洁:每个 HTTP 动词都是一个同名函数。
- 强大:Session、Cookie、代理、SSL、流式上传/下载,开箱即用。
- 社区:几乎所有云平台 SDK 都内置或兼容
requests
。
一句话:只要你的代码需要“上网”,就先把 import requests
敲上去——剩下的,它都帮你搞定了。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!