很多人判断蜘蛛池有没有在跑,只看一件事:日誌里有没有蜘蛛。有来訪就放心了。但真正要看的是下一段——蜘蛛從入口頁出發之後,有没有繼續往目标站走。如果入口頁天天有蜘蛛,目标站的抓取量却纹丝不動,問题通常不在“蜘蛛池没用”,而在鏈路的某一环断了。
先分清两件事:来訪和传递
蜘蛛来訪只說明入口頁被發現了,連結传递才决定目标站能不能被顺带發現。這两件事的检查入口不一样:前者看入口站的訪問日誌,後者要看目标站的日誌里有没有出現對應的抓取记錄。如果只有前者没有後者,就可以按下面的顺序往下排。
第一處:入口頁自己是不是可抓的
這是最容易被忽略、也最容易修的一环。先確認三件事:
- 狀態碼:入口頁返回 200。如果返回 301、302 或 404,蜘蛛會按規則處理,未必按你预想的方式繼續。
- robots 與 meta:入口站自己的 robots.txt 没有把整站挡掉,頁面也没有 noindex。這两處只要中一個,蜘蛛来了也等于白来。
- 响應時間:入口頁打開慢,蜘蛛可能在超时前就撤了。不要只看自己浏览器的速度,要看服務器端的首字节時間。
第二處:連結是不是真的能被爬到
入口頁面上看得见和爬得到是两回事。常见的情况有:
- 連結是用 JS 渲染出来的,而蜘蛛拿到的是未渲染的 HTML;
- 連結带 nofollow,或者被脚本拦截了預設跳轉;
- 連結文本為空、图片連結缺 alt,或者被 CSS 层遮住,人点得到但结构上不明顯;
- 锚点指向占位地址,實际跳轉靠脚本完成。
判断方法很直接:把入口頁的 HTML 源碼拉下来,用文本方式搜目标域名。源碼里搜不到,就別指望蜘蛛能顺着走過去。
第三處:跳轉方式决定了蜘蛛跟到第几跳
如果入口頁和目标站之間還有中間层,跳轉方式就格外重要。301 是明确可跟的;302 一般也會跟,但语义上不是永久迁移;JS 跳轉和 meta refresh 的可靠性明顯更低,多跳之後更容易断。中間层越多,每一跳都打折,最後能到目标站的抓取自然就少了。
第四處:目标站自己接不接得住
入口頁一切正常,也可能是目标站把蜘蛛挡在门外:目标站的 robots.txt、防火墙規則、CDN 的爬虫策略、频繁出現的 5xx,都會让蜘蛛拿到頁面却無法正常抓取。還有一種情况是目标站内容長期不變,蜘蛛来了几次發現没有新東西,来訪频率自然下降。這不是鏈路問题,是内容更新的問题。
一個可复用的排查顺序
- 在入口站日誌里確認蜘蛛确實来過,记錄時間與 UA;
- 同一時間段去目标站日誌里找,看有没有對應来源的抓取;
- 没有的话,回到入口頁,用源碼搜目标域名,確認連結存在;
- 確認連結存在後,检查跳轉類型和跳轉层數;
- 最後检查目标站的 robots、防火墙規則與响應狀態。
排查时別一次改好几處。一處一處改,每改一處观察几天日誌,才能知道是哪一步起了作用。
几個常见的判断誤区
第一,把蜘蛛来訪量当成效果指标。来訪量高但目标站抓取没變化,說明传递环节有問题,加再多入口站也只是在同一個断点上加量。第二,只看頁面能不能打開,不看源碼里有没有連結。第三,频繁調整入口頁结构和跳轉方式,導致日誌里几種情况混在一起,反而没法判断。
入口頁、連結、跳轉、目标站,這四段任何一段断了,後面的量都上不来。與其急着加资源,不如先把這几段的日誌對一遍,找到卡点再動手,通常比盲目扩容更省事。