一条 awk 命令,把蜘蛛抓取行为做成报表

来源:互联网 时间:2026-09-08

想知道百度蜘蛛每天来多少次、都在抓哪些目录,多数人的第一反应是去搜索资源平台看抓取频次曲线。那条曲线只有全站总量,拆不出目录维度,也看不出哪个页面被抓爆、哪个页面从没被碰过。这些细颗粒度的答案,其实全躺在 access.log 里,一把 awk 就能挖出来。

Nginx 默认的 combined 格式里,第 7 个字段是请求 URL,第 9 个字段是返回码,第 4 个字段是带时区的时间。先用 grep 把蜘蛛 UA 过滤出来,再用 awk 按不同维度聚合,三五个命令行就凑齐一套蜘蛛行为报表,不用装任何东西。

# 百度蜘蛛总抓取次数

grep -c "Baiduspider" /var/log/nginx/access.log

# 蜘蛛抓取的目录分布,按次数倒序

grep "Baiduspider" /var/log/nginx/access.log \

| awk '{print $7}' \

| awk -F/ '{print "/"$2}' \

| sort | uniq -c | sort -rn | head -20

目录分布能立刻暴露两件事:抓取资源集中在哪,以及哪些目录在空耗抓取。列表页和内容页占大头是健康的;如果 /tag、/search 这类程序生成的路径占了两三成,抓取预算就在被浪费——治理思路留到抓取预算那篇细说。接着看返回码分布和时间曲线。

# 蜘蛛抓取的返回码分布

grep "Baiduspider" /var/log/nginx/access.log \

| awk '{print $9}' | sort | uniq -c | sort -rn

# 每小时抓取量曲线($4 形如 [03/Sep/2026:14:07,

# 从第 14 位起截 2 位即小时数)

grep "Baiduspider" /var/log/nginx/access.log \

| awk '{print substr($4,14,2)":00"}' \

| sort | uniq -c

# 被抓最多的 10 个页面

grep "Baiduspider" /var/log/nginx/access.log \

| awk '{print $7}' | sort | uniq -c | sort -rn | head -10

时间曲线有个实战价值:蜘蛛通常凌晨抓得勤,如果你的站恰好那个时段做备份或跑批任务,服务器负载一高,蜘蛛的抓取意愿会跟着受影响。两条曲线叠着看,错峰安排任务就能避开。想聚合谷歌蜘蛛,把 grep 的关键词换成 Googlebot 即可,统计逻辑完全一样。

# 百度+谷歌一起统计,输出一份完整小结

for spider in Baiduspider Googlebot; do

echo "== $spider =="

grep "$spider" /var/log/nginx/access.log \

| awk '{code[$9]++} END {for (c in code) print c, code[c]}' \

| sort -rn

done

验证口径很简单:grep -c 出来的总次数,量级应该和搜索资源平台抓取频次工具里的日抓取量对得上。对不上先查两件事——日志切割有没有漏、平台数据有没有延迟。

两个容易翻车的细节提前交代:一是 UA 过滤只认 Baiduspider 字符串,冒充蜘蛛的假爬虫会混进统计里,严格场景可以先反查 IP 归属再算数,蜘蛛真伪验证那篇讲过具体方法;二是目录聚合用 / 做分隔符取第二段,对带参数的长 URL 同样有效,但嵌套更深的目录结构要按实际层级调整取段位置,先 head 看几行原始记录再定。

awk 报表的短板是没有历史趋势,所以它适合做即时诊断,趋势要靠后面的 Python 日报脚本来补。

相关阅读:本篇属于《SEO 自动化总清单:日、周、月、季各该跑什么》日志组,轻量 awk 报表配合总纲里的例行节奏,蜘蛛数据天天有,不用等出问题再翻日志。

相关文章

A5创业网 版权所有

返回顶部