分析蜘蛛爬虫对 HTTP 和 HTTPS 的抓取偏好,唯一可靠的办法是把服务器访问日志按「爬虫 UA × 请求协议($scheme)」做交叉统计;结论先行:主流蜘蛛(Googlebot、bingbot、Baiduspider)在两种协议都能返回 200 时优先抓 HTTPS,但前提是 HTTPS 证书有效、内链与 sitemap 指向 HTTPS,否则它会老老实实按你给的协议爬。
为什么不能靠 UA 或协议版本判断蜘蛛的抓取偏好?
结论:UA 可以伪造,$server_protocol(HTTP/1.1 或 HTTP/2)也区分不了 HTTP 与 HTTPS,只有 $scheme 变量才是可信依据。
很多人看日志里写着 HTTP/1.1 就以为是 HTTP 请求,这是错的——HTTPS 请求绝大多数也走 HTTP/1.1。Nginx 默认的 combined 格式根本不记录协议,直接统计出来的数字全是废的。必须先改日志格式,把 $scheme 加进去:
log_format main '$remote_addr - [$time_local] "$request" $status "$http_user_agent" $scheme';
改完 reload,等日志积累至少 24 小时(爬虫抓取有明显波峰,样本太短会失真),再开始统计。
怎么用日志算出蜘蛛在 HTTP 和 HTTPS 上的抓取比例?
结论:一条 awk 命令就能出结果,前提是 $scheme 是日志行的最后一个字段。
假设已按上面的格式配置,直接跑:
grep -i "googlebot" access.log | awk '{print $NF}' | sort | uniq -c
典型输出是这样的:
8412 https
1903 http
如果 HTTP 与 HTTPS 用了两个 server 块、写到两个日志文件,那就更省事,wc -l 分别统计即可:
grep -ci "baiduspider" /var/log/nginx/http_access.log
grep -ci "baiduspider" /var/log/nginx/https_access.log
把 googlebot 依次换成 bingbot、baiduspider、yandexbot,就能得到各蜘蛛的协议分布。注意三点:
- HTTP 侧请求数长期稳定但不为零,通常是外链仍指向 http://,蜘蛛跟过去被 301 了,这属于正常现象,不代表它偏爱 HTTP。
- 要同时看状态码。如果 http:// 那批请求里 301 占比接近 100%,说明蜘蛛是在跟随跳转,不是主动选择。
- 别用 UA 当唯一证据。想确认身份,对
crawl-*.googlebot.com 这类域名做反向 DNS 校验,伪造 UA 的垃圾爬虫会把比例算歪。
怎么判断蜘蛛到底「爬到了哪个版本」?
结论:看 301 的目标地址和最终 200 的 URL,而不是看它请求了什么。
用 curl 模拟蜘蛛,直接观察服务端行为:
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" \
-A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
http://example.com/
返回 301 https://example.com/ 说明站点强制 HTTPS,蜘蛛最终索引的一定是 HTTPS 版本。再测一遍 HTTPS:
curl -s -o /dev/null -w "%{http_code} %{num_redirects} %{url_effective}\n" \
-A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/
如果这里变成 302 跳回 HTTP,那问题就大了——抓取预算会被来回跳转吃掉,页面基本别想收录。
sitemap 和内链的协议会决定蜘蛛的选择吗?
结论:会。sitemap.xml 里写什么协议,蜘蛛第一波就按什么协议爬。
检查两件事:sitemap.xml 中所有 <loc> 是否统一为 https,robots.txt 里的 Sitemap: 行是否也指向 https 地址。如果 sitemap 混着 http 和 https 两种 URL,蜘蛛会分别抓两遍,等于凭空多出一倍的重复内容。同理,站内导航、分页、面包屑的链接也要统一成相对路径或 https 绝对路径。
怎么用站长平台数据交叉验证日志结论?
结论:日志是原始数据,站长平台是过滤后的数据,两者对比能排除 UA 伪造的干扰。
Google Search Console 的「设置 → 抓取统计信息」可以按响应码分组查看 Googlebot 抓取量,和日志里 200 的数量对照,差距应该在一个量级以内。百度搜索资源平台的「抓取频次」和「抓取诊断」能看到 Baiduspider 最近抓的 URL,抓取诊断结果里会显示抓取地址,直接就能看到它用的是 http 还是 https。如果平台显示蜘蛛在抓 HTTPS、日志里却全是被 301 的 HTTP 请求,说明有大量陈旧外链还指向 http 版本,需要靠 301 长期消化。
一句话总结怎么做
按「改日志格式加 $scheme → awk 按 UA 分组统计 → curl 验证跳转链 → 核对 sitemap 与内链协议 → 站长平台交叉验证」这五步走一遍,半天之内就能拿到自己站点上蜘蛛协议偏好的确切答案,不依赖任何猜测。