站点出問题的时候,很多人的第一反應是改标题、改描述、加内容。但抓取是否顺畅、蜘蛛到底来了几次、它卡在哪一步,這些答案通常早就寫在服務器的訪問日誌里。日誌不會撒谎,它只是没人讀。
先讀日誌,再猜原因
訪問日誌记錄的是每一次真實請求,包括訪客的、也包括搜尋引擎蜘蛛的。相比各種後台工具给出的延迟資料和抽样结果,日誌是原始素材。它的價值不在于資料量大,而在于可以按自己的問题去篩選:我想知道蜘蛛昨天爬了哪些地址、這些地址返回了什么狀態碼、有没有反复爬同一個没有價值的頁面。
讀日誌不需要复杂工具,常用的命令行就够。建议先做一件事:把最近一天到最近一周的日誌各留一份,方便做前後對比。單看一天容易誤判,比如刚好那天蜘蛛大掃除,或者刚好那天服務器抽風。
日誌里優先看這几列
- 狀態碼: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 集中出現在某一批舊連結,就补跳轉或修正連結;比如蜘蛛反复抓取某類無意义頁面,就想想它為什么會被發現,再决定是否限制入口。改完等一两周,再回来看同一组資料,確認變化是不是朝预期方向走。
日誌是记錄,不是判决书。它给出的是一條线索,不是一個结果;能不能被正常抓取、能不能被收錄,仍然取决于内容本身和長期的站点狀態。把日誌当成每月一次的例行体检,比出事後临时抱佛脚要有用得多。