如何分析蜘蛛对网站 sitemap 的抓取情况?
通过站长平台核对 sitemap 提交状态,结合服务器或 CDN 日志按蜘蛛筛选请求并统计抓取频次、状态码和时段,交叉验证百度、Google、Bing 等蜘蛛是否抓取 sitemap 及哪些 URL 未抓。
学完这篇,你能自己从服务器日志和站长平台两头交叉验证,判断百度、Google、Bing 这些蜘蛛到底有没有来抓 sitemap、抓了多少次、哪些 URL 没被抓。
第一步:先确认 sitemap 提交入口和状态
这一步是拿到「蜘蛛应该抓什么」的基准,做完你会知道各平台记录的 sitemap 提交时间和最近抓取结果。
- 百度:打开 ziyuan.baidu.com,进「普通收录」→「sitemap」,这里会列出你提交的 sitemap 地址、提交时间、最近一次抓取状态,点「刷新」旁边的明细还能看抓取失败原因。
- Google:打开 search.google.com/search-console,左侧「索引」→「站点地图」,填入 sitemap 地址后会显示「成功」「无法获取」等状态,以及已发现的网址数。
- Bing:打开 bing.com/webmasters,进「站点地图」,同样能看到提交状态和 URL 发现数。
如果这里显示的是「无法获取」(Google)或「抓取失败」,先别急着看日志,去解决 HTTP 状态码问题。
第二步:确认 sitemap 本身返回正常
这一步验证蜘蛛访问 sitemap 时收到的是不是 200 和正确的 XML,做完能排除「服务器层就把蜘蛛挡了」。
在服务器上执行:
curl -sI https://www.example.com/sitemap.xml
看三个东西:HTTP/1.1 200 OK、Content-Type: application/xml(或 text/xml)、Content-Length 不为 0。如果你用了 gzip 静态文件,还要确认没有把 .gz 后缀当成默认返回内容。
注意:很多站点的 sitemap 是被 CDN 缓存的,源站日志里根本看不到蜘蛛请求。这种情况必须去 CDN 控制台(比如阿里云 CDN 的「日志管理」→「实时日志」)拉日志,否则你会误判成「蜘蛛从没来过」。
第三步:从 Nginx 日志里筛出蜘蛛对 sitemap 的请求
这一步是核心数据来源,做完你能看到每次 sitemap 抓取的时间、蜘蛛身份和状态码。
grep -i "sitemap.xml" /var/log/nginx/access.log \
| grep -Ei "baiduspider|googlebot|bingbot|sogou|360spider" \
| awk '{print $1, $4, $7, $9, $11, $12, $13}' | tail -50
字段含义:$1 是蜘蛛 IP,$4 是时间,$7 是请求路径,$9 是状态码,后面几列是 UA。
如果日志是按天切割并压缩过的,把 access.log 换成 access.log.*.gz 并加 zgrep。
注意:UA 可以伪造。Googlebot 用
nslookup 66.249.x.x应反解出googlebot.com域名,百度蜘蛛同理反解baidu.com。只看 UA 会把别人爬虫当成搜索引擎蜘蛛。
第四步:按蜘蛛统计抓取频次、状态码和时段
这一步把原始日志变成可判断的数字,做完你能看出「哪个蜘蛛不常来、哪个状态码异常」。
抓取频次:
grep -i "sitemap.xml" /var/log/nginx/access.log \
| grep -oEi "baiduspider|googlebot|bingbot" \
| sort | uniq -c | sort -rn
状态码分布(把 baiduspider 换成你要查的蜘蛛):
grep -i "sitemap.xml" /var/log/nginx/access.log | grep -i baiduspider \
| awk '{print $9}' | sort | uniq -c
按小时看抓取规律:
grep -i "sitemap.xml" /var/log/nginx/access.log | grep -i baiduspider \
| awk '{split($4,a,":"); print a[2]}' | sort | uniq -c
注意:如果 sitemap 请求量极低(一天个位数),不代表没抓——很多蜘蛛只在 sitemap 内容更新(
lastmod变化)时才回头抓,先确认你的 sitemap 生成脚本有没有真的更新时间戳。
第五步:比对 sitemap 里的 URL 和实际被抓的 URL
这一步找出「你提交了但蜘蛛没抓」的页面,做完能定位是日志问题还是收录问题。
curl -s https://www.example.com/sitemap.xml \
| grep -oP '(?<=<loc>)[^<]+' | sort -u > sitemap_urls.txt
grep -i baiduspider /var/log/nginx/access.log \
| awk '{print $7}' | sort -u > crawled_paths.txt
comm -23 sitemap_urls.txt crawled_paths.txt | head -30
输出的就是 sitemap 里有、但日志里从未出现过的 URL。数量很大说明 sitemap 里的 URL 质量或数量超出了蜘蛛的抓取预算。
第六步:用站长平台的抓取报告交叉验证
这一步用平台自己的数据核对日志结论,做完能避免「日志只记录了源站」这类偏差。
- Google Search Console:左侧「设置」→「抓取统计信息」,看「按响应类型」「按抓取目的」两条曲线,其中就包含 sitemap 的抓取次数。
- 百度搜索资源平台:「普通收录」→「抓取频次」看每日总量;「抓取诊断」可以手动发起一次抓取,实时看返回的 HTTP 头和 HTML 前 128KB。
- 服务器侧想省事,可以用 GoAccess 一次性出报表:
goaccess /var/log/nginx/access.log --log-format=COMBINED -o report.html
打开 report.html,在「请求的文件」里搜 sitemap,就能看到次数、状态码和访客来源。
小结
- 判断蜘蛛抓 sitemap 情况,数据源有三处:源站/CDN 访问日志、站长平台提交记录、平台抓取统计,三者要交叉看。
- 核心命令是
grep筛 sitemap +grep筛蜘蛛 UA,再用awk取状态码、时间字段做uniq -c统计。 - 只信 UA 会踩坑,Googlebot 和百度蜘蛛都要反解 IP 域名确认。
- sitemap 请求少不一定是没抓,先检查
lastmod是否真的更新。 - 用
comm -23比对 sitemap URL 与日志路径,能直接列出未被抓取的页面。
原文链接:https://www.gj0.com/thread-1718.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。