搭建蜘蛛池时,大家习惯把精力花在内容量、連結结构、域名资源上,协议层的東西常常被当成基础设施,預設不會出問题。可恰恰是這一层出了問题,前面做的所有工作都可能归零——因為爬虫没有浏览器的容错能力。
浏览器會点“繼續訪問”,爬虫不會
證书過期、證书鏈不完整、域名與證书不匹配,這些情况在浏览器里通常只是一個红色警告,用戶点一下“繼續訪問”就進去了。但大多數搜尋引擎爬虫在 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 解析差异。
- 定期掃一遍所有入口頁域名,把即將過期的證书單獨列出来。
這些检查花不了多少時間,但能避免忙了半個月铺頁面、结果蜘蛛一個都没来的情况。协议层不出彩,却是最底层的前提,出問题时代價也最大。