在工程实践中,HTTPS 爬虫比 HTTP 多了 TLS/证书、SNI、HTTP/2、压缩与更严格的服务端校验。本文以开发者角度给出可执行的方法论:如何稳健发起 HTTPS 请求、处理证书与重试、应对常见反爬策略、以及遇到难以复现的移动端/真机问题时的抓包调试流程。
一、可靠发起 HTTPS 请求的基本要点
- 选择合适的客户端:
requests(同步)、httpx/aiohttp(异步、并发)、Selenium/Playwright(需要渲染)。 - 证书校验不要随意关闭:仅在受控测试环境使用
verify=False;生产请使用系统 CA 或指定 CA bundle:
import requests
resp = requests.get("https://api.example.com", timeout=10, verify="/path/to/ca_bundle.pem")
- 处理 SNI 与 HTTP/2:现代库默认支持 SNI;如果需要 HTTP/2,优先选
httpx并做兼容验证。 - 自动重试与限时:对短暂网络抖动、502/503 使用指数退避重试,避免盲目重试导致封禁。
二、抓包与调试技巧(定位 HTTPS 问题)
- 先用代理抓包(Charles / mitmproxy / Fiddler):在本地启动代理并让爬虫走代理,观察请求头、Host、Cookie 与响应。mitmproxy 支持脚本化修改,适合复现边界场景。
- 若代理显示 CONNECT 或无法解密,检查证书是否被正确安装与信任(移动设备需额外信任)。
- 当怀疑是 TLS 握手问题或网络层丢包,用
tcpdump+ Wireshark 分析 ClientHello / ServerHello、TLS Alert。 - 移动端或 App 接口不可抓时,考虑 USB 直连抓包工具(例如 Sniffmaster):可直接从 iOS/Android 真机抓流量并导出 PCAP,帮助判断是客户端证书、Pinning 还是网络链路问题。
三、反爬防护的工程化对策
- 请求伪装与会话保持:使用常见浏览器 UA、合理 Referer、Accept-Language,且用
Session/持久连接保留 cookie。 - 代理池与 IP 轮换:用稳定的高匿代理并监控可用率、延迟与错误码;对代理异常及时剔除。
- 速率控制与随机化:请求速率、并发数与时间间隔随机化,避免突发流量集中触发防护。
- 降级策略:若目标站点使用 JS 签名或验证码,优先尝试官方 API 或拿到授权;不得违规绕过需与产品/法务确认。
- 指纹与行为模拟:对于复杂站点,用 Playwright 模拟浏览器环境并尽量还原真实交互(但注意资源成本)。
四、常见问题与快速解决清单
CERTIFICATE_VERIFY_FAILED:更新certifi、指定 CA 或在测试环境使用受控证书。- 响应为空或被重定向到登录页:检查 Cookie、CSRF、Referer 与时钟偏差(签名过期)。
- 返回二进制(protobuf)或乱码:看
Content-Type与Content-Encoding(解压 gzip/brotli 或用 proto 文件解析)。 - 只有移动端报错:用 Sniffmaster 抓真机流量,导出 PCAP 在 Wireshark 中比对 ClientHello、SNI 与证书链。
五、实例排查流程(遇到“只在真机出错”)
- 在桌面环境用代理抓包确认接口与签名逻辑可行。
- 在真机上先通过浏览器验证是否能访问同一 URL(验证证书与网络)。
- 若 App 报 TLS 错误,尝试用 Sniffmaster 抓取该 App 的流量,导出 PCAP,检查是否存在
certificate_required或bad_certificate报文。 - 根据结果决定:在测试库替换证书、修正客户端证书安装、或与后端协作放开测试白名单。
六、工程化建议与日志策略
- 把请求/响应、重试记录、代理使用情况与 TLS 错误率纳入日志与告警;设置阈值(如连续 5 次握手失败触发调查)。
- 在 CI 环境增加对关键 API 的抓包回归测试,确保签名或证书变更被及时发现。
- 对抓包数据(PCAP)做访问控制与脱敏,避免凭证泄露。