
本文详解如何使用 python requests 库成功获取依赖 php 会话(session)的验证码图片,解决因缺失 cookie 导致请求返回空白或错误响应的问题,并提供可直接运行的完整示例代码与关键注意事项。
本文详解如何使用 python requests 库成功获取依赖 php 会话(session)的验证码图片,解决因缺失 cookie 导致请求返回空白或错误响应的问题,并提供可直接运行的完整示例代码与关键注意事项。
在爬取如 DPDC 缴费系统 这类基于 PHP 的 Web 应用时,其验证码(Captcha)通常由 simple-php-captcha.php 等脚本动态生成,并严格依赖服务端 Session 状态——即:必须先访问包含验证码表单的页面(如登录页),由服务器设置有效的 PHPSESSID Cookie;后续对验证码图片 URL 的请求,需携带该 Cookie,否则服务器将拒绝返回图像(常见表现为返回空内容、302 重定向、403 或 HTML 错误页)。
你原始代码失败的根本原因在于:直接请求验证码 URL(如 .../simple-php-captcha.php?...)时,未提供任何会话上下文,服务器无法识别合法请求来源,因此无法生成或输出图片。
✅ 正确做法是分两步执行带状态的请求:
- 首次 GET 表单页面:触发服务器创建会话并返回 Set-Cookie 头(含 PHPSESSID);
- 二次 GET 验证码 URL:复用上一步获取的 cookies,确保请求携带有效会话标识。
以下是经过验证、可直接运行的完整解决方案:
import requests
from urllib.parse import urljoin
# Step 1: 访问表单页面,获取会话 Cookie
form_url = "https://www.php.cn/link/88e3fa7a7462c4ce017655ee2ea2ad46"
session = requests.Session() # 推荐显式使用 Session 对象管理状态
form_response = session.get(form_url, timeout=10)
form_response.raise_for_status() # 检查 HTTP 状态码是否成功
# Step 2: 动态提取验证码图片 URL(关键!避免硬编码过期链接)
# 查看网页源码,通常 captcha <img alt="如何正确抓取动态生成的验证码图片(含会话依赖处理)" > 的 src 是相对路径,如:./application/libs/captcha/...
# 使用 BeautifulSoup 解析更健壮(需安装:pip install beautifulsoup4)
from bs4 import BeautifulSoup
soup = BeautifulSoup(form_response.text, 'html.parser')
captcha_img = soup.find('img', {'id': 'captcha_img'}) or soup.find('img', src=True)
if not captcha_img:
raise RuntimeError("Failed to locate captcha <img alt="如何正确抓取动态生成的验证码图片(含会话依赖处理)" > tag in the form page.")
# 构建绝对 URL(处理相对路径)
captcha_src = captcha_img.get('src') or captcha_img.get('data-src')
captcha_url = urljoin(form_url, captcha_src)
# Step 3: 使用同一 session 请求验证码图片
captcha_response = session.get(captcha_url, timeout=10)
captcha_response.raise_for_status()
# 验证响应内容是否为 PNG 图像(可选但强烈推荐)
if 'image/png' not in captcha_response.headers.get('content-type', ''):
print(f"Warning: Unexpected content-type: {captcha_response.headers.get('content-type')}")
print("Response preview:", captcha_response.content[:100])
# Step 4: 保存为文件(供后续 OCR 或 Keras 模型处理)
with open('captcha.png', 'wb') as f:
f.write(captcha_response.content)
print("✅ Captcha image saved successfully as 'captcha.png'")? 关键注意事项:
- ❌ 禁止硬编码验证码 URL:URL 中的 t= 时间戳参数极易失效(如你原例中 t=0.84582400+1651208314),务必通过解析 HTML 动态获取最新 src;
- ✅ 始终使用 requests.Session():自动管理 Cookie、连接复用,比手动传 cookies= 更可靠;
- ⚠️ 检查响应头与内容:添加 raise_for_status() 和 content-type 校验,快速定位 4xx/5xx 或非图像响应;
- ? 注意反爬策略:部分站点会校验 Referer 或 User-Agent,必要时可补充:
session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Referer': form_url }) - ? 后续处理建议:保存的 captcha.png 可直接输入 Keras CNN 模型进行端到端识别,或先用 OpenCV 做二值化/去噪预处理。
掌握这一“会话感知”的请求模式,不仅能解决 DPDC 验证码问题,也适用于绝大多数基于 PHP Session 的传统 Web 验证码采集场景——轻量、高效、无需 Selenium。

















