站点出问题的时候,很多人的第一反应是改标题、改描述、加内容。但抓取是否顺畅、蜘蛛到底来了几次、它卡在哪一步,这些答案通常早就写在服务器的访问日志里。日志不会撒谎,它只是没人读。
先读日志,再猜原因
访问日志记录的是每一次真实请求,包括访客的、也包括搜索引擎蜘蛛的。相比各种后台工具给出的延迟数据和抽样结果,日志是原始素材。它的价值不在于数据量大,而在于可以按自己的问题去筛选:我想知道蜘蛛昨天爬了哪些地址、这些地址返回了什么状态码、有没有反复爬同一个没有价值的页面。
读日志不需要复杂工具,常用的命令行就够。建议先做一件事:把最近一天到最近一周的日志各留一份,方便做前后对比。单看一天容易误判,比如刚好那天蜘蛛大扫除,或者刚好那天服务器抽风。
日志里优先看这几列
- 状态码:200 是正常取回,301/302 是跳转,404 是不存在,5xx 是服务器自己出错。5xx 尤其值得警惕,蜘蛛连续撞上几次,往往会降低到访频率。
- 爬虫标识:日志里的 User-Agent 能区分 Googlebot、Bingbot、Baiduspider 等。注意有些普通程序会伪造 UA,如果某个 IP 高频抓取却从不遵守 robots,多半不是真的蜘蛛。
- 请求路径:看蜘蛛把抓取次数花在了哪些地址上。如果排行榜前几名全是标签页、筛选页、站内搜索结果页,说明抓取预算被低价值页面吃掉了。
- 响应时间与字节数:同一类页面里,某些地址响应特别慢或返回体积异常大,通常指向个别图片、附件或数据库查询拖了后腿。
动手筛三个常用视图
下面命令里的字段序号是按常见日志格式写的,如果你的格式不同,先打开文件看一眼再调整。所有操作建议在日志副本上做。
- 看状态码分布:awk '{print $9}' access.log | sort | uniq -c | sort -rn | head -20。这一行能立刻告诉你,有多少请求是 404,有多少是 5xx。
- 数蜘蛛到访量:grep -iE 'googlebot|bingbot|baiduspider' access.log | wc -l。把日期拆开对比几天,就能看出抓取频次是在上升还是慢慢变冷。
- 排高频抓取地址:grep -i 'googlebot' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -30。把结果和你的栏目结构对照,看蜘蛛是不是只在门口打转。
三个容易忽略的细节
时区
服务器日志的时间多数是服务器本地时区,而蜘蛛的行为规律往往跟着它自己的时区走。对比「今天和昨天」之前,先确认日志时间和你后台工具的时间是不是同一套,否则会得出错误的结论,比如以为蜘蛛半夜不来,其实是差了几个小时。
日志轮转与保留
很多服务器默认按天或按大小轮转日志,一周后就自动删掉。真出问题时,最早的记录往往最有用。建议至少保留 30 天,必要时把历史日志压缩归档,别让它把磁盘占满,也别在需要排查的时候发现文件已经没了。
日志本身别公开
日志里可能包含访客 IP、后台地址、测试链接甚至带参数的内部路径。这些文件默认放在站点根目录下是危险的,确认它只能通过服务器本地或受控通道读取。
看过之后,先改一两处
读完日志最容易犯的错,是列出一长串问题然后一次全改。更稳妥的做法是先挑一两个确认度最高的:比如 404 集中出现在某一批旧链接,就补跳转或修正链接;比如蜘蛛反复抓取某类无意义页面,就想想它为什么会被发现,再决定是否限制入口。改完等一两周,再回来看同一组数据,确认变化是不是朝预期方向走。
日志是记录,不是判决书。它给出的是一条线索,不是一个结果;能不能被正常抓取、能不能被收录,仍然取决于内容本身和长期的站点状态。把日志当成每月一次的例行体检,比出事后临时抱佛脚要有用得多。