蜘蛛抓一個頁面通常分两段:先把 HTML 源碼拿回去,再把頁面放進渲染队列,执行脚本、加载样式和图片。第一段只要服務器正常返回,内容基本就到手了;第二段能還原出什么,取决于這些渲染资源允不允许被抓。
渲染资源本身也是抓取對象
很多站点只盯着 HTML,忽略了 CSS、JS、图片、字体同样是蜘蛛要發起的獨立請求。它們被挡住时,後果並不一样:
- CSS 被屏蔽:頁面结构還在,但布局信息缺失,判断某段内容是不是正文、是不是隐藏元素會變难,抽取结果的准确度下降。
- JS 被屏蔽:依赖脚本插入的正文、列表、導航可能整块消失,蜘蛛看到的是一張空壳頁面。
- 图片被屏蔽:文字内容一般不受影响,但頁面完整性受损,图片搜尋的收錄机會也基本没了。
- 字体、图标被屏蔽:影响較小,但若因此引發大量 403,日誌里會混進不少噪音。
三類常见誤伤
問题往往不是有意屏蔽,而是配置顺手带出来的。
robots.txt 的通配寫法
比如 Disallow: /assets/、Disallow: /*.js$、Disallow: /static/,本意是挡掉後台或临时文件,结果把整站样式和脚本一起挡了。寫完規則後,把關键资源路径逐條對着規則走一遍,比事後排查省事得多。
WAF 與 CDN 的静態资源校驗
有些防護策略只對静態资源做频率或 UA 校驗,正常用戶訪問没事,蜘蛛密集請求时却被 403。還有一種情况是防盗鏈:图片校驗 Referer,蜘蛛請求不带来源,直接拿不到。日誌里通常表現為同一批静態资源反复报错。
懒加载與滚動触發
用 data-src 存放真實地址、再靠脚本替換,或者列表只在滚動到底部时才請求下一頁,這些做法在浏览器里体驗不错,但蜘蛛未必會滚動、未必會等。首屏内容尽量直接寫在 HTML 里,後續内容用可点击的分頁連結承载,比押注脚本更稳。
自查顺序
- 關掉 JS 打開頁面,看還剩多少可见内容,能對上就說明主要内容不依赖脚本。
- 抓取几個代表頁,检查静態资源的返回碼,重点看 403、404 和超时。
- 翻服務器日誌,看静態资源的抓取量是否異常接近零。正常站点這部分請求量通常遠大于 HTML。
- 移動端和桌面端各看一遍,两套 UA 對應的资源加载策略有时並不一致。
渲染资源的請求數量通常遠超 HTML 本身,但它真正的價值不在數量,而在于它决定了蜘蛛最终看到的是一個完整頁面,還是一張空壳。
把资源体积也纳入考虑
体积越大,單次渲染耗时越長,單位時間里能處理完的頁面就越少。合並零碎的小文件、開啟压缩、把非關键脚本延後加载,都是常規做法。但要注意別把關键样式也延迟到脚本执行之後,那等于人為制造一次渲染失敗。资源優化和抓取效率是同一件事的两面,不必分開看。