站点里的新頁面,往往不是蜘蛛自己猜出来的,而是顺着某一條連結走到的。同一條目标地址,寫在不同的位置、用不同的方式,被讀到的概率並不一样。理解這些寫法的差异,能解释不少“頁面明明上线了,却迟迟没有抓取记錄”的情况。
蜘蛛拿到 URL 的几條路
常见的入口大概有四類:外部網站指向你的連結、站内頁面的連結、XML Sitemap,以及搜尋引擎提供的提交接口。其中站内連結是持續性最强的一條——只要頁面還在,蜘蛛每次来訪都能重新走一遍。外鏈受制于人,Sitemap 是一份清單而不是一條路径,提交接口更适合作為补充。真正决定一個 URL 能不能被反复發現、反复回来的,通常是内鏈结构。
一條連結被讀到,需要满足三個條件
- 出現在 HTML 里:蜘蛛拿到的原始响應中就带有這個地址,而不是等脚本执行後才生成。
- 能被解析:href 指向的是真實可訪問的 URL,而不是 javascript:void(0)、單獨的 # 号,或者依赖点击事件的占位寫法。
- 目标能返回正常内容:連結可以被跟随,跳轉层級不長,目标返回 200。
标准 a 标簽最稳
<a href="/path"> 這種寫法没有額外條件,蜘蛛解析到 href 就能把地址放進待抓取队列。用 button 加 onclick 跳轉、用 span 绑定 JS 事件跳轉的寫法,在原始 HTML 里看不到目标地址,需要等渲染,甚至根本讀不到目标 URL——即便用戶最终能点開,對 URL 發現来说也弱很多。
JS 生成連結的邊界
如果列表内容由前端框架渲染,蜘蛛看到的第一段 HTML 可能只有一個空容器。渲染阶段确實有机會补上這些連結,但多一道工序就多一次失敗的可能。能让關键導航和列表連結出現在服務端返回的 HTML 里,URL 發現會稳定不少。
rel 属性:被讀到不等于被跟随
nofollow、sponsored、ugc 這類属性,表達的是“這條連結的關系”。在 URL 發現這件事上,最保險的做法仍然是:需要被發現的連結,用普通連結寫在頁面主体区域,而不是依赖带属性的寫法去碰运气。
位置不同,發現效果不同
同一個 URL,放在主導航、面包屑、正文首屏,還是頁脚深處,被走到的频率並不一样。導航和面包屑几乎每個頁面都有,相当于给同一條路径做了多次重复;正文里的上下文連結,通常比頁脚批量堆叠的連結更有參考價值。分頁連結則是列表頁能否被繼續翻下去的關键:如果“下一頁”只是一個按钮,而不是可跟随的連結,後面的條目就容易被漏掉。
一份简單的自查清單
- 關掉 JavaScript,或直接查看頁面源代碼,看關键連結是否已经存在。
- 抽查几個核心頁面,確認 href 是完整可達的 URL,有没有多余的跳轉。
- 检查導航、面包屑、分頁按钮是否輸出為 a 标簽。
- 確認重要連結没有落在需要登入或需要交互才出現的区域。
- 把 Sitemap 里的 URL 與站内實际能走到的 URL 對一遍,找出只在清單里、没有任何内鏈指向的“孤岛頁面”。
孤岛頁面不是不能被抓取,而是缺少被反复發現的路径。给它补一條從相關頁面出發的内鏈,通常比反复提交更有效。
小结
URL 發現的本质是路径問题:連結寫得越接近标准 HTML,路径就越短,蜘蛛走到目标的确定性越高。把導航、面包屑、分頁和正文連結寫扎實,再让 Sitemap 與提交接口做补充,新頁面被看到的速度和稳定性都會好一些。這不保證一定被收錄,但至少不會因為寫法問题,提前把路堵上。