你的网站日志里,蜘蛛真的来过吗?

你有没有试过:文章发了三天,百度站长平台显示“抓取频次正常”,可收录数纹丝不动?点开日志一看,好家伙——全是/wp-admin/admin-ajax.php和带一长串?s=xxx&ref=xxx的搜索页……蜘蛛根本没碰你最想被收录的那几篇干货。

别靠猜。Linux服务器的日志文件,就是蜘蛛留下的原始打卡记录。今天不讲虚的,直接带你翻日志、找IP、看它到底点了啥。

为什么必须从服务器日志看蜘蛛?

第三方工具给的是“二手消息”:它只能告诉你“大概率有蜘蛛来过”。而你的Nginx或Apache日志,记的是真刀真枪的每一次请求——哪个IP、几点几分、用的什么User-Agent、访问了哪个URL、返回了200还是503。

这些细节直接决定收录结果。比如我帮一个做工业滤网的客户查日志,发现Baiduspider每天来30多次,但80%的请求都卡在/product-list.php?cat=12&page=1这种无限分页上,真正该抓的/product/xx-1000-filter.html反而排在队尾。问题不是蜘蛛不来,是它被带偏了。

第一步:找到你的网站日志文件在哪

先别急着敲命令,得知道去哪翻。Nginx用户,90%的情况日志就在:

/var/log/nginx/access.log

如果开了多站点,可能是:

/var/log/nginx/yourdomain.com.access.log

Apache用户通常在:

/var/log/apache2/access.log
# 或
/var/log/httpd/access_log

实在不确定?直接搜配置文件里的日志路径:

# Nginx
grep "access_log" /etc/nginx/nginx.conf /etc/nginx/sites-enabled/*

# Apache
grep "CustomLog" /etc/apache2/apache2.conf /etc/apache2/sites-enabled/*

输出里带.log的那个路径,就是你要盯的“监控录像”。

核心方法:如何用命令快速筛选蜘蛛IP?

几GB的日志,别打开vim硬啃。三行命令搞定:

grep -i "googlebot\|bingbot\|baiduspider\|bytespider" /var/log/nginx/access.log | awk '{print $1}' | sort -u

说明一下:

  • grep -i:忽略大小写,防漏掉小写的googlebot
  • awk '{print $1}':默认日志第一列是IP(Nginx标准格式)
  • sort -u:排序+去重,避免同一个IP刷屏

如果你用的是Apache,或者日志格式被改过(比如加了前置时间戳),IP可能在第2列或第3列——那就把$1换成$2试试,再不行就head -1 /var/log/nginx/access.log看看实际格式。

进阶分析:蜘蛛到底在抓取什么页面?

光知道IP没用,得看它点了哪扇门。继续用上面那个grep结果,只换一行:

grep -i "baiduspider" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -15

这行命令会输出:
127 /article/how-to-choose-filter.html
89 /search/?q=filter
42 /wp-login.php

一眼就能看出问题:蜘蛛一半时间在搜站内搜索页,还试图登录后台?这时候该去robots.txt加一句Disallow: /search/,或者给搜索页加noindex

如何验证一个IP是不是真的官方蜘蛛?

网上有爬虫爱装Googlebot。真李逵和假李逵,得验身份证。

Googlebot验证(推荐用host):
假设你从日志里捞到IP 66.249.66.1,执行:

host 66.249.66.1

如果返回 crawl-66-249-66-1.googlebot.com,就是正品。如果返回一堆乱码域名,或者超时——十有八九是冒牌货。

百度蜘蛛验证:
直接去百度搜索资源平台 →「抓取诊断」→「蜘蛛IP段」,下载最新IP段列表(是个TXT),用这个命令比对:

grep "61.135.185" baidu_ip_ranges.txt

只要IP落在列表里,基本可信。封禁前务必走这步,别误伤。

长期监控:怎样自动化跟踪蜘蛛抓取情况?

每天手动跑命令太累?写个5行脚本,让它自己干:

#!/bin/bash
DATE=$(date +%Y%m%d)
grep -i "baiduspider" /var/log/nginx/access.log | awk '{print $1, $7}' > /tmp/baidu_today_$DATE.log
# 再加一行,统计TOP10 URL
grep -i "baiduspider" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -10 >> /tmp/baidu_today_$DATE.log

保存为/root/check_spider.sh,然后加进定时任务:

# 每天凌晨2点执行
0 2 * * * /bin/bash /root/check_spider.sh

每周一早上,ls /tmp/baidu_today_*.log,挑最新的文件扫一眼——蜘蛛行为有没有突变,一目了然。

今天下班前就能做完的一件事

现在,打开你的终端,粘贴这行命令(记得把路径换成你自己的):

grep -i "googlebot" /var/log/nginx/access.log | tail -20 | awk '{print $1, $7, $9}'

它会显示最近20条Google蜘蛛的记录:IP、访问的URL、HTTP状态码。
重点看第三列 $9:如果是200,说明顺利抓取;如果是301,说明页面跳转了;如果是404503……恭喜,你刚定位到一个收录障碍点。
花三分钟,截图发给自己,明天晨会就能说:“咱们首页的canonical标签可能有问题——Googlebot连续三次抓到了带www和不带www的两个版本。”