做蜘蛛池的人经常碰到一種情况:入口頁明明放了几百條連結,日誌里也看到搜尋蜘蛛来過,可被抓的目标 URL 只集中在前面一小部分,後面的好像從来没出現過。這種时候,問题往往不在連結寫法,而在頁面本身的体积——搜尋蜘蛛可能根本没讀到頁面後半段。
搜尋蜘蛛為什么會有讀不完的情况
搜尋引擎抓取網頁並不是無限量讀取。抓取有字节上限,解析 HTML 时也有大小和节点數方面的限制。頁面越大,越容易在到達某個阈值後被截断處理。被截断之後,後面的内容對搜尋引擎等于不存在:里面的連結不會被排队,目标 URL 也就無從被發現。
這個阈值各家搜尋引擎不同,也會随版本變化,通常在几 MB 的量級,具体以官方文档為准。與其记住某個數字,不如记住一個原則:入口頁越轻,連結越靠前,被發現的机會越稳。
哪些寫法最容易把頁面撑大
- 图片直接寫成 base64 内联,一個横幅就可能几百 KB;
- 内联大段 CSS、JS,尤其是打包後没做压缩的文件;
- 用大量嵌套标簽拼出几百行連結,每行還带一堆内联样式;
- 把整個站点的連結一次性铺在一頁上,動辄上千條;
- 把 JSON 或配置資料直接塞進 script 标簽里。
這些内容本身不一定有害,但它們會占用抓取配額,把真正要暴露的連結挤到後面去。
怎么判断入口頁是不是被截断了
按下面几步排查,比空想有用:
- 用浏览器查看源碼或 curl 拉一次,看入口頁原始 HTML 大概是多少 KB 或多少 MB;
- 對照日誌里被抓的目标 URL,看是不是大多集中在頁面靠前的位置;
- 把連結顺序打乱再观察一轮,如果被抓的结果跟着顺序變化,基本可以確認是截断;
- 核對服務器日誌里的响應字节數,和本地文件大小是否一致,排除传輸中断或压缩問题。
如果乱序測試之後,被抓的仍然是頁面最前面那一批,那問题就不在連結本身,而是頁面太大,蜘蛛没讀到後面。
让連結更容易被讀到的做法
- 連結前置:把要暴露的目标 URL 放在 HTML 靠前的位置,装饰性内容放後面;
- 精简頁面:CSS、JS 走外鏈,图片用外鏈地址,去掉内联大文件;
- 拆分入口頁:一頁几十到一两百條連結,比一頁几千條更容易被完整讀取;
- 用 sitemap 兜底:把目标 URL 同时寫進 sitemap,入口頁只是补充渠道,不是唯一通道;
- 別依赖 JS 渲染:連結寫在静態 HTML 里,通常比等渲染更稳妥。
几個常见誤区
頁面能正常打開,就說明蜘蛛讀完了
人能打開,是因為浏览器邊下邊渲染,還會繼續請求後續资源;蜘蛛通常只抓一次,讀到上限就停。两者的体驗並不一样。
把連結重复放两遍就能被發現
如果前半段就已经被截断,在同一区域重复放連結意义不大。真正有用的是减少總体积,並把連結提前。
多開几個入口頁就能弥补
單頁被截断的問题,靠增加入口頁數量补不回来,因為每個頁面都要重新面對同一個上限。先把單頁做轻,再考虑數量。
小结
入口頁不是越丰富越好。對搜尋蜘蛛来说,讀得完比寫得多更重要。控制 HTML 体积、把目标連結放在前面、再用 sitemap 做一层补充,URL 被發現的机會會稳一些。至于目标頁最终能不能被收錄,還取决于它自身的质量和竞争情况,這不是入口頁能單方面决定的。