
某些网站(如 whatismyipaddress.com)会检测并拦截缺少合法浏览器特征的请求,导致仅返回调试信息头而非真实 html 内容;本文详解如何通过设置合规请求头(user-agent、accept 等)绕过该限制。
某些网站(如 whatismyipaddress.com)会检测并拦截缺少合法浏览器特征的请求,导致仅返回调试信息头而非真实 html 内容;本文详解如何通过设置合规请求头(user-agent、accept 等)绕过该限制。
在使用 requests 库配合 HTTP 代理爬取网页时,你可能会遇到一种典型现象:对 Google 等主流站点能正常获取完整 HTML,但访问 whatismyipaddress.com、httpbin.org 或部分反爬较强的工具类网站时,响应体(response.text)却只包含类似服务器环境变量的键值对(如 REMOTE_ADDR、HTTP_USER-AGENT),而非预期的网页内容。这并非代理失效或网络异常,而是目标网站主动识别出请求“非浏览器行为”,从而返回调试响应(常见于 PHP 开发环境或反爬中间件)。
根本原因在于:这些站点默认将无明确 User-Agent、Accept、Accept-Language 等头部的请求视为“非人类流量”或“开发测试请求”,进而触发简易响应逻辑(例如直接输出 $_SERVER 变量),而非渲染真实页面。
✅ 正确做法是模拟真实浏览器请求头。以下为推荐配置示例:
import requests
proxies = {
'http': 'http://3.127.121.101:80',
'https': 'http://3.127.121.101:80'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'en-US,en;q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
}
try:
response = requests.get(
"https://whatismyipaddress.com/",
proxies=proxies,
headers=headers,
timeout=10,
verify=False # ⚠️ 生产环境请勿禁用 SSL 验证,应使用 certifi 或指定证书路径
)
response.raise_for_status() # 自动检查 HTTP 错误状态码
print(response.text[:500] + "..." if len(response.text) > 500 else response.text)
except requests.exceptions.RequestException as e:
print(f"请求失败:{e}")? 关键注意事项:
-
代理协议格式必须正确:
proxies字典中键应为'http'和'https'(而非'http://'或'https://'),否则 requests 会忽略代理; - User-Agent 务必真实且不过时:建议定期更新为当前主流浏览器 UA,避免因 UA 过旧被识别为爬虫;
-
启用
raise_for_status():及时捕获 4xx/5xx 响应,避免静默失败; -
慎用
verify=False:跳过 TLS 验证虽可绕过证书错误,但存在中间人攻击风险;生产环境应安装certifi并保持其更新,或显式传入证书路径; -
补充安全头(可选):如
Sec-Fetch-*系列头部可进一步提升请求可信度,尤其对现代 CDN(Cloudflare、Akamai)更友好。
总结来说,该问题本质是服务端的“请求指纹识别”机制,而非 requests 或代理本身缺陷。通过构造符合浏览器标准的请求头,即可稳定获取目标网页的真实响应内容。建议将常用 headers 封装为函数或配置常量,便于复用与维护。

















