非常好 👍 我们现在进入 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"])

✅ 技巧:

  1. 打开网页 → 按 F12 → Network → XHR 查看请求;
  2. 找到对应的 POST 请求
  3. 复制其 URL、Headers、Form Data 或 JSON Data
  4. 在 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复制浏览器请求头完整还原
返回 403UA 被识别为爬虫使用真实浏览器 UA,或代理
返回乱码网站编码非 UTF-8response.encoding = 'gbk'
返回 HTML 登录页登录态未保持使用 requests.Session()
被封禁 IP请求太频繁增加随机延迟或使用代理池

✅ 十二、总结对比

方法使用场景特点
requests.get()普通网页请求简单直接
requests.post(data=...)表单提交登录、注册、搜索
requests.post(json=...)JSON 接口AJAX、API 数据爬取
requests.post(files=...)上传文件图片、文档接口

📦 小结

requests.post() 是爬虫的核心武器之一
✔ 掌握它可以让你抓取几乎所有 “动态API数据”
✔ 和浏览器配合(通过 F12 分析)能轻松找到真正的后端接口