搭建蜘蛛池时,大家习惯把精力花在内容量、链接结构、域名资源上,协议层的东西常常被当成基础设施,默认不会出问题。可恰恰是这一层出了问题,前面做的所有工作都可能归零——因为爬虫没有浏览器的容错能力。
浏览器会点“继续访问”,爬虫不会
证书过期、证书链不完整、域名与证书不匹配,这些情况在浏览器里通常只是一个红色警告,用户点一下“继续访问”就进去了。但大多数搜索引擎爬虫在 TLS 握手阶段遇到校验失败,会直接放弃这次请求,记录下来的是一个抓取错误,而不是“这个页面内容不错”。
更麻烦的是,这类错误往往不会立刻暴露。它不会让你的监控报警,因为服务器 CPU、内存、带宽都正常;你只会发现某个批次的入口页迟迟没有爬取记录,回过头去查才发现是证书在几天前到期了。
HTTP 和 HTTPS 双版本共存的问题
不少蜘蛛池在配置时会让 http 和 https 两个版本都能访问,返回同样的内容。对爬虫而言这是两个不同的 URL,会各自消耗抓取资源,也容易造成同一个入口页被重复发现。
比较稳妥的做法是选定一个版本作为主版本,另一个用 301 永久跳转到主版本,并且在入口页里输出对应的 canonical 指向主版本。注意跳转要放在服务器层完成,不要用 JS 或 meta refresh 兜底,那对爬虫来说不够干脆。
证书本身常见的几种问题
- 过期:最典型也最容易避免。证书有效期在缩短,批量管理几十上百个域名时,最好提前 30 天做续期,别等最后一周。
- 域名不匹配:证书里只写了主域名,但入口页挂在 www 或某个子域上,握手就会失败。用 SAN 证书把常用子域列进去,或按需拆分。
- 证书链不完整:只部署了站点证书,没带中间证书。浏览器多数能自动补链,但一些爬虫客户端不一定,结果就是部分 IP、部分客户端报错。
- 自签证书:内部测试可以用,正式对外的入口页不要用,爬虫不会信任未知 CA。
混合内容与 HSTS
HTTPS 页面里如果引用了 HTTP 的图片、脚本或样式,现代浏览器会拦截或警告。搜索引擎爬虫在渲染页面时会受影响,虽然对发现链接这件核心事情影响有限,但如果你指望通过页面里的链接引导蜘蛛继续爬,最好还是把这些资源统一到 HTTPS。
HSTS 头一旦下发,客户端会强制走 HTTPS,这在正常情况下是好事。但如果你在调试阶段误开了 HSTS 又撤回了 HTTPS 配置,回访的客户端会在相当长一段时间里连不上,爬虫也一样。批量域名上 HSTS 之前,先确认 HTTPS 已经稳定运行。
多域名场景下的证书选择
蜘蛛池往往有大量域名,逐个申请单域名证书管理成本高。常见做法有两种:
- 泛域名证书:一张证书覆盖同一主域下的多个子域,适合结构集中的域名组,但不覆盖不同的主域名。
- 多域名(SAN)证书:一张证书里列多个域名,适合一批互不相关的域名。缺点是其中一个域名不需要了,重新签发时要动整张证书,影响面大。
没有绝对优劣,看你的域名是集中在少数主域下,还是完全分散。关键是别为了省事把所有域名塞进一张证书里,一张证书出问题,全线受影响。
几分钟就能做的自检
- 用 curl -I https://域名 看响应头和最终状态码,确认没有意外的 5xx 或跳转循环。
- 用 openssl s_client -connect 域名:443 -servername 域名 看证书链是否完整、有效期还剩多久。
- 换一个网络环境(比如不同机房的机器)再访问一次,排除局部网络或 DNS 解析差异。
- 定期扫一遍所有入口页域名,把即将过期的证书单独列出来。
这些检查花不了多少时间,但能避免忙了半个月铺页面、结果蜘蛛一个都没来的情况。协议层不出彩,却是最底层的前提,出问题时代价也最大。