很多人一听 requests 模块,脑瓜子嗡嗡的。什么 get、post、headers、json,感觉跟看天书似的。
其实特简单。requests 就是你在互联网上"要饭"的艺术。 你把"要饭"这门手艺搞明白了,这辈子都忘不掉。
一、requests 是啥?就是网上要饭
想象一个场景。
你是娃哈哈,饥肠辘辘,兜里没钱。
马路对面有一家服务器大排档,招牌上写着:www.laowangchaofen.com。
你走过去,扯着嗓子喊:
import requests
response = requests.get('https://www.laowangchaofen.com/menu')
print(response.text)
老板在厨房里听见了,探出头回你:
<html>
<body>
<h1>老王炒粉菜单</h1>
<ul>
<li>蛋炒粉 - 15元</li>
<li>肉炒粉 - 20元</li>
<li>惠灵顿牛排 - 不存在,滚</li>
</ul>
</body>
</html>
这一来一回,就是一次完整的 requests 请求。
requests.get()就是你喊的那句话:"老板,菜单给我看看!"response就是老板端上来的那盘菜response.text就是菜的内容(HTML 字符串)response.status_code就是老板的脸色(200=笑嘻嘻,404=没有这道菜)
记住:requests 的本质就是"伸手要"。 你要菜单、要图片、要数据,都要靠它喊一嗓子。
二、GET:站在门口喊
你去大排档,最常见的姿势就是站在门口喊。
import requests
# 站在门口喊:"老板,你家有没有炒粉?"
response = requests.get('https://www.laowangchaofen.com/menu')
print(f"老板脸色:{response.status_code}")
print(f"菜单内容:{response.text[:100]}") # 只看前100字,太多了
GET 的特点:
- 你的要求全写在 URL 里,就像站在门口喊,路过的人都能听见
- 只能"要",不能"给"(不能带食材过去让老板加工)
带参数喊:
import requests
# 站在门口喊:"老板,来盘蛋炒粉,不要葱,加辣!"
params = {
'dish': '蛋炒粉',
'no_onion': 'true',
'spicy': 'extra'
}
response = requests.get(
'https://www.laowangchaofen.com/order',
params=params
)
print(response.url)
# 结果:https://www.laowangchaofen.com/order?dish=蛋炒粉&no_onion=true&spicy=extra
看到没?你的要求全暴露在 URL 里了,跟站在门口裸奔一样。
三、POST:走进厨房递食材
有时候,你不仅要点菜,还要自带食材让老板加工。
import requests
# 走进厨房,递上自带的和牛
data = {
'dish': '惠灵顿牛排',
'material': '和牛',
'cook_level': 'medium_rare'
}
response = requests.post(
'https://www.laowangchaofen.com/kitchen',
data=data
)
print(f"老板脸色:{response.status_code}")
print(f"回话:{response.text}")
POST 的特点:
- 你带的东西放在
data里,不在 URL 里显示,相对隐私 - 适合提交表单、登录账号、发表评论
递 JSON 格式的食材:
import requests
# 有些老板只收 JSON 格式的订单
json_data = {
'dish': '惠灵顿牛排',
'material': '和牛',
'cook_level': 'medium_rare'
}
response = requests.post(
'https://www.laowangchaofen.com/kitchen',
json=json_data # 注意这里用 json=,不是 data=
)
print(response.json()) # 老板回的也是 JSON,直接解析
一句话记住:
GET 是站在门口喊,POST 是走进厨房递食材。
四、Headers:你的名片和口味偏好
你去大排档,有时候需要亮身份,或者告诉老板你的特殊要求。
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', # 假装是浏览器
'Accept': 'text/html', # 我只要 HTML,不要 JSON
'Authorization': 'Bearer 我的会员卡号123456', # 我是 VIP
'Referer': 'https://www.google.com' # 我从谷歌来的,别把我当爬虫
}
response = requests.get(
'https://www.laowangchaofen.com/vip-menu',
headers=headers
)
print(response.text)
Headers 就是你在 HTTP 世界里的名片:
User-Agent:你是谁(浏览器?爬虫?APP?)Accept:你要什么格式的菜(HTML?JSON?图片?)Authorization:你的会员卡(登录凭证)Referer:你从哪来(有些老板看这个决定卖不卖给你)
很多网站防爬虫,就是看你 Headers 里的 User-Agent。 你直接 requests.get() 去要,它一看你是"python-requests/2.28.1",直接 403 黑脸:"不卖给你,滚。"
解决办法:换个 Headers,假装是浏览器。
五、Response:老板端上来的菜
老板回你了,你得会看。
import requests
response = requests.get('https://www.laowangchaofen.com/menu')
# 老板的脸色
print(response.status_code) # 200(笑嘻嘻)
# 菜的原始内容(HTML 字符串)
print(response.text[:200])
# 菜的二进制内容(图片、视频、PDF 用这个)
# print(response.content)
# 老板回的 JSON(如果菜单是 API 接口)
# print(response.json())
# 老板给的 Headers(配料单)
print(response.headers)
# 你点的 URL(确认一下有没有被重定向)
print(response.url)
# 编码方式(防止中文乱码)
print(response.encoding)
重点记住三个:
response.status_code:老板脸色(200 成功,404 没有,500 炸了)response.text:字符串内容(HTML、普通文本)response.json():JSON 数据(现代 API 最常用的格式)
六、Cookie:你的会员卡
HTTP 是无状态的,老板记性极差。你刚点了炒粉,五分钟后要加可乐,老板问你:"你是谁?"
Cookie 就是你的会员卡。
import requests
# 第一次来,老板给你发会员卡
session = requests.Session()
# 登录(老板给你发卡)
login_data = {
'username': '毛小白',
'password': '123456'
}
session.post(
'https://www.laowangchaofen.com/login',
data=login_data
)
# 现在会员卡自动带上了,直接点 VIP 菜
response = session.get('https://www.laowangchaofen.com/vip-menu')
print(response.text)
# 再点一杯可乐,会员卡还在
response = session.get('https://www.laowangchaofen.com/order/cola')
print(response.text)
requests.Session() 的妙用:
- 自动保存和发送 Cookie,不用你手动管理
- 连接复用,比每次
requests.get()更快 - 适合登录后的连续操作(爬虫、自动化脚本)
一句话:
requests.get()是散客,每次都要重新自我介绍;Session()是熟客,会员卡自动亮。
七、超时和异常:老板不理你怎么办
有时候老板厨房炸了,或者网络断了,你的请求会卡住。
import requests
from requests.exceptions import RequestException, Timeout, ConnectionError
try:
# 等 3 秒,老板不回话就撤
response = requests.get(
'https://www.laowangchaofen.com/menu',
timeout=3
)
print(response.text)
except Timeout:
print("老板太忙了,3秒没回话,换一家!")
except ConnectionError:
print("大排档关门了,网线被拔了!")
except RequestException as e:
print(f"出事了:{e}")
timeout 参数:
timeout=3:等 3 秒,超时就抛异常timeout=(3, 27):连接等 3 秒,读取等 27 秒
异常处理:
Timeout:老板不理你ConnectionError:大排档根本不存在(域名错了、断网了)HTTPError:老板回话了,但脸色不好(4xx、5xx)RequestException:所有异常的爹,兜底用
八、代理:让别人帮你喊
有些大排档不接待你,或者你不想让老板知道你是谁。
import requests
proxies = {
'http': 'http://127.0.0.1:7890',
'https': 'http://127.0.0.1:7890'
}
response = requests.get(
'https://www.laowangchaofen.com/menu',
proxies=proxies
)
print(response.text)
代理就是找个中间人帮你喊:
- 你 → 代理服务器 → 大排档
- 大排档看到的是代理的 IP,不是你的
爬虫必备技能。 很多网站限制访问频率,用代理池轮换 IP,才能持续要饭。
九、终极总结(背下来)
import requests
# 基础要饭
response = requests.get('https://api.example.com/data')
# 带参数要饭
response = requests.get(url, params={'key': 'value'})
# 递食材
response = requests.post(url, data={'key': 'value'})
response = requests.post(url, json={'key': 'value'})
# 亮名片
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
# 熟客模式
session = requests.Session()
session.post(url, data=login_data) # 登录
session.get(url) # 自动带 Cookie
# 看老板脸色
if response.status_code == 200:
data = response.json() # 或 response.text
else:
print(f"老板炸了:{response.status_code}")
# 不等了
response = requests.get(url, timeout=5)
口诀:
requests 像要饭,get 喊 post 递。
headers 亮名片,session 是熟客。
status_code 看脸色,text 是字符串,json 是字典。
timeout 防卡死,代理帮你喊,异常要兜底。
写在最后
下次再有人问你"Python 怎么发 HTTP 请求",你就说:
"import requests,然后伸手要。"
他要是问你"GET 和 POST 区别",你就说:
"GET 是站在门口喊,POST 是走进厨房递食材。递啥?递 JSON。"
散会。