非常好 👍 我们现在进入 Python Web Crawler(第7课)——用 requests 模拟发送 POST 请求。
这节课是你从“基础网页抓取”迈向“接口级数据爬取”的关键一课 🚀
🕷️ Python Web Crawler(7)——用 requests
模拟发送 POST 请求
一、HTTP 请求方式回顾
在 Web 爬虫中,最常见的请求方式有两种:
请求方式 | 特点 | 典型用途 |
---|---|---|
GET | 将参数附加在 URL 后面 | 访问网页、获取公开资源 |
POST | 参数放在请求体中 | 表单提交、接口调用、用户登录等 |
📍 示例对比:
GET: https://example.com/search?q=python
POST: https://example.com/login (参数放在请求体中)
二、安装 requests 模块(如未安装)
pip install requests
三、最基础的 POST 请求示例
import requests
url = "https://httpbin.org/post"
data = {
"username": "admin",
"password": "123456"
}
response = requests.post(url, data=data)
print(response.text)
✅ https://httpbin.org/post
是一个测试接口,会返回你发送的请求信息。
输出内容(部分):
{
"form": {
"password": "123456",
"username": "admin"
}
}
🔹
data
参数用于模拟 HTML 表单提交。
🔹 适用于普通网页登录、注册、搜索表单等。
四、模拟 JSON 格式 POST 请求
许多现代网站使用 JSON 与后端通信(如 AJAX、REST API)。
import requests
import json
url = "https://httpbin.org/post"
payload = {
"user": "阿杰",
"action": "login",
"status": "active"
}
response = requests.post(url, json=payload)
print(response.json())
✅ 注意区别:
data=data
→ 表单提交(Content-Type:application/x-www-form-urlencoded
)json=data
→ JSON 请求(Content-Type:application/json
)
五、模拟登录网站(表单POST示例)
例如登录某网站:
import requests
url = "https://example.com/login"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
data = {
"username": "admin",
"password": "123456"
}
session = requests.Session() # 创建会话,保持登录状态
response = session.post(url, headers=headers, data=data)
print("登录结果状态码:", response.status_code)
print("Cookies:", session.cookies.get_dict())
✅ 使用 requests.Session()
可以:
- 自动保存 cookies;
- 在后续请求中保持登录状态。
六、使用 POST 请求获取数据接口(模拟API)
有些网站的数据接口直接通过 POST 提交获取数据,比如分页列表。
import requests
url = "https://example.com/api/getNews"
payload = {
"page": 1,
"pageSize": 10
}
headers = {
"User-Agent": "Mozilla/5.0",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
for item in data.get("news", []):
print(item["title"])
✅ 技巧:
- 打开网页 → 按 F12 → Network → XHR 查看请求;
- 找到对应的 POST 请求;
- 复制其 URL、Headers、Form Data 或 JSON Data;
- 在 Python 中用
requests.post()
模拟即可。
七、发送文件(POST 上传)
import requests
url = "https://httpbin.org/post"
files = {"file": open("example.txt", "rb")}
response = requests.post(url, files=files)
print(response.text)
✅ files
参数自动设置 multipart/form-data
适用于上传图片、文件等接口。
八、发送带 Cookies 的 POST 请求
import requests
url = "https://example.com/user/info"
cookies = {"sessionid": "abcdef123456"}
response = requests.post(url, cookies=cookies)
print(response.text)
九、模拟 Headers(伪装成真实浏览器)
很多网站会检测请求头是否来自真实用户。
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Referer": "https://example.com/login",
"Accept-Language": "zh-CN,zh;q=0.9"
}
response = requests.post(url, headers=headers, data=data)
✅ 建议:始终携带 User-Agent
,否则可能被封禁或返回403。
🔟 完整示例:模拟分页POST爬取新闻接口
import requests
import time
url = "https://example.com/api/news"
headers = {"User-Agent": "Mozilla/5.0"}
for page in range(1, 6):
payload = {"page": page, "pageSize": 10}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
print(f"第 {page} 页:")
for item in data["articles"]:
print(" -", item["title"])
time.sleep(1) # 防止请求过快被封
✅ 这类 POST 请求通常出现在:
- 新闻网站分页加载;
- 搜索接口;
- 电商商品加载;
- 评论或回复接口。
✅ 十一、常见问题与排查技巧
问题 | 可能原因 | 解决方法 |
---|---|---|
返回空数据 | 缺少 Headers / Cookies | 复制浏览器请求头完整还原 |
返回 403 | UA 被识别为爬虫 | 使用真实浏览器 UA,或代理 |
返回乱码 | 网站编码非 UTF-8 | response.encoding = 'gbk' |
返回 HTML 登录页 | 登录态未保持 | 使用 requests.Session() |
被封禁 IP | 请求太频繁 | 增加随机延迟或使用代理池 |
✅ 十二、总结对比
方法 | 使用场景 | 特点 |
---|---|---|
requests.get() | 普通网页请求 | 简单直接 |
requests.post(data=...) | 表单提交 | 登录、注册、搜索 |
requests.post(json=...) | JSON 接口 | AJAX、API 数据爬取 |
requests.post(files=...) | 上传文件 | 图片、文档接口 |
📦 小结
✔ requests.post()
是爬虫的核心武器之一
✔ 掌握它可以让你抓取几乎所有 “动态API数据”
✔ 和浏览器配合(通过 F12 分析)能轻松找到真正的后端接口
发表回复