⭐ 推荐:社区规则条款 V1.0

如何分析蜘蛛爬虫对 HTTPS 和 HTTP 协议的抓取偏好?

juming
juming 归队站长新人站长
发布于 2026-10-14 19:30 ·3 浏览 ·3 回复
内容摘要

分析蜘蛛对 HTTP 和 HTTPS 的抓取偏好应基于服务器日志按爬虫 UA 与 $scheme 交叉统计,主流蜘蛛在 HTTPS 有效且内链和 sitemap 指向 HTTPS 时优先抓 HTTPS,否则跟随给定协议,并需结合状态码、30

本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-1970.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 3

满月居于空
满月居于空 版主资深会员新人站长 👑年卡会员 1楼 2026-10-14 19:47

结论:方法方向是对的,但按「请求数」算比例会把结论算歪,得按 URL 去重后再统计。

原因很简单:同一个 URL 在 HTTPS 下被反复抓 20 次、HTTP 下只跟了 3 次 301,请求数比例看着 HTTP 占了 13%,实际上蜘蛛早就认 HTTPS 了。建议先从 $request 里提取 path 去重,再按 scheme 计数;更狠一点的做法是按「IP + path」分组,看每个 URL 最后一次请求落在哪个 scheme 上,那才代表它的真实选择。

日志格式再补一刀:$scheme 后面顺手加上 $server_protocol 和 $request_time,这样 HTTP/2 和 HTTP/1.1 一眼能分。改完 nginx -s reload 就行,不必 restart。

反向 DNS 校验记得前向回验:Google 是 crawl-*.googlebot.com,百度是 baiduspider-*.crawl.baidu.com,必应是 *.search.msn.com。只 host 一次不够,得把解析出的 IP 反查回原 IP 才算证实,否则伪造 UA 的采集器会把比例带偏。

观察窗口别低于一周,GSC 的抓取统计本身就有两三天延迟,样本短了全是噪声。

延伸一句:如果只做了 301、没上 HSTS,蜘蛛偶尔还会用 HTTP 试探一下,这很正常;想真正「锁定」偏好,把 sitemap 和内链全量换成 HTTPS 再挂 HSTS,两三周后 HTTP 侧请求会衰减到接近于零。

liulian
liulian 归队站长新人站长 #1524 2楼 2026-10-14 20:04
满月居于空:结论:方法方向是对的,但按「请求数」算比例会把结论算歪,得按 URL 去重后再统计。 原因很简单:同一个 URL 在 HTTPS 下被反复抓 20 次、HTT…

去重方向完全认同,但「每个 URL 最后一次请求落在哪个 scheme」这个指标本身是有偏的,得再往前推一步:真正代表蜘蛛主动选择的是首次命中的入口协议,不是最后落点。

原因在于 http → https 的 301 链条终点天然就是 HTTPS,按「最后落点」统计等于用结果解释结果,跑出来必然是接近 100% 的 https,没有区分度。所以我倾向取每个 path 的首次出现记录,看它第一次发现这个 URL 时走的是什么协议——这时的来源是外链、sitemap 还是内链才有解释力。命令大致是:

grep -i googlebot access.log \
  | sed -E 's/.*"(GET|HEAD) ([^ ]+).* ([a-z]+)$/\3 \2/' \
  | sort -k2 -u \
  | awk '{c[$1]++} END{for(s in c) print s, c[s]}'

$server_protocol 和 $request_time 我也加,但主要是为了看 HTTP/2 复用和慢爬,判断协议偏好还是只认 $scheme。前向回验那步补一条可用的写法:

n=$(host $ip | awk '{print $NF}'); host $n | grep -q "$ip" && echo ok

另外提醒一个比 UA 更容易翻车的坑:站点挂了 CDN 的话,源站 Nginx 看到的 $scheme 往往是回源那一跳,可能是 http,统计出来整站都偏 http,白忙一场。这种情况要么取 CDN 侧日志,要么把 $scheme 换成 $http_x_forwarded_proto。HSTS 那段我也同意,不过它只对「先走过一次 HTTPS 拿到 header」的会话生效,首访 HTTP 是拿不到的,所以锁定偏好真正靠的还是内链和 sitemap 全量换 HTTPS,HSTS 只是加锁。

lqyyzz
lqyyzz 观望站长 #1527 3楼 2026-10-14 20:20
liulian:去重方向完全认同,但「每个 URL 最后一次请求落在哪个 scheme」这个指标本身是有偏的,得再往前推一步:真正代表蜘蛛主动选择的是**首次命中的入口协议**…

认可你的方向:用「最后落点」统计确实是被 301 链条污染的结果变量,入口协议才有解释力。但那条命令有个坑——sort -k2 -u 在 key 相同时会退化成整行比较,取到的不一定是最早那条,很可能把 http 和 https 混着留下。日志本身是按时间追加的,直接用 awk '!seen[$2]++' 拿首次更稳;多个日志文件先 ls -tr 再 cat,保证时间序。

第二,「首次命中协议」只能说清蜘蛛从哪儿发现这个 URL,说不清它的偏好。外链全是 http、sitemap 是 https 的站点,首次分布反映的是渠道结构,还是用来源解释来源。真正代表偏好的是稳态:滤掉只抓过 1~2 次的 URL,只看抓取次数 ≥3 的 path 里 https 占比,再叠加 http 侧 301 占比一起看——301 接近 100%、稳态 HTTPS 又高,才是证书有效且内链 sitemap 已全量换 HTTPS 时蜘蛛的真实选择。

CDN 那条完全同意,补一点:$http_x_forwarded_proto 可能是多值(https,http)或直接缺失,建议用 map 只取第一段,并兜底回落 $scheme,别直接把变量当单值用。HSTS 再补一句:纯靠响应头的话首访 HTTP 确实拿不到,除非站点进了浏览器 preload 列表,但那个门槛高,锁定偏好的主力还是内链 + sitemap。

所以三个指标建议分层看:入口协议看发现渠道,稳态协议看真实偏好,状态码看是否只是跟随跳转——单看任何一个都会被自己绕进去。