说到“連結”,大部分人預設想的是 <a href>。但實际頁面里,希望蜘蛛走到的地方,未必都寫成了 a 标簽:入口用图片、按钮用表單、内容区块用 iframe 嵌進去、跳轉靠 meta refresh。這些寫法在浏览器里都点得動、跳得走,到了蜘蛛那邊却不一定被当成一條可抓取的連結。下面把常见情况分成三档来说:哪些相對稳定,哪些只能算补充,哪些基本不要指望。
稳定的那一档:a 标簽里的 href
蜘蛛顺着連結爬行的基础,是一個能被解析出来的 href 属性。只要是 a 标簽加 href,地址是正常的绝對或相對路径,没有靠脚本改寫、没有被属性拼出来,它就是一個可靠的入口。锚文本會一並被讀到,這也是判断目标頁主题的參考之一。
所以真正该做的是:把重要入口都落成 a 标簽。導航、面包屑、列表項标题、正文里的推荐位、頁脚的關键栏目,都用 a,而不是用其他元素“模拟”出一個連結。
可能被讀到的那些:可以补充,別当主路
iframe 的 src
iframe 里承载的頁面地址寫在 src 上,通常可以被發現。但要注意两点:一是 iframe 常被用来嵌第三方内容,這類 URL 抓不抓、收不收由對方站点决定;二是嵌進来的内容在頁面上没有正常的連結上下文,對本站抓取路径的帮助有限。如果某個頁面只能從 iframe 里進,最好在頁面上补一個 a 連結。
图片、视频等资源地址
<img src>、<source srcset>、<video src> 這些同样會暴露地址,但它們指向的是资源文件,不是 HTML 頁面。指望“图片被讀到,詳情頁就被發現”並不靠谱。正确的寫法是让 a 包住 img:連結寫在 a 上,图片只是連結的外观。
head 里的 link 元素
<link> 能带各種 URL:rel="canonical"、rel="alternate"(多語言)、rel="next" 和 rel="prev" 等。它們的语义是“說明關系”,不是“這里有一個可以点的連結”。搜尋引擎會讀這些信息,但不要把列表的下一頁只寫在 rel="next" 里。頁面上该有的分頁連結,還是要有。
表單的 action
搜尋、篩選、提交後跳轉,经常靠 form action 完成。多數情况下,表單不會被当成普通的連結路径去走。希望结果頁被抓到,更稳妥的做法是:一方面让這類结果頁有一個可訪問的固定地址,另一方面在頁面上放一個指向它或者指向代表頁的 a 連結。
meta refresh
這種跳轉不同引擎的處理方式不一样,可能被当成重定向處理,也可能被忽略。站内跳轉用 301 或 302 更明确;给用戶看的“几秒後自動跳轉”頁面,最好同时给出一個可点的連結,別让用戶和蜘蛛都等那個計时。
基本不要指望的几種寫法
- CSS 里的地址:background-image、@import 引用的文件,一般不會作為頁面連結被發現。
- 点击事件里的地址:onclick 里寫跳轉、事件绑定後再導航,都需要执行脚本才成立。
- data-* 属性里存的 URL:属性里放着地址,不等于頁面上有一條連結。
- 纯文字形式的網址:頁面上寫着 example.com/page,讀者要自己複製粘贴,蜘蛛也不會当成連結。
- 按钮元素本身:button 不带跳轉能力,得靠脚本配合。
落到操作上的几條
- 導航、面包屑、列表、正文推荐位、頁脚栏目,统一用 a 标簽,href 寫成可解析的地址。
- 图片入口、卡片入口:a 包住 img,不要只放一個 img。
- 分頁的上一頁、下一頁,除了在 head 里标注關系,頁面上也要能点。
- 篩選、搜尋後的结果頁,尽量给一個稳定地址,並在頁面上留 a 入口。
- 發布後抽检:在浏览器里關掉 JS,只靠鼠标点,看能不能從入口走到目标頁。
判断标准其實很简單:關掉 JS,只用鼠标点頁面上的連結,能不能走到那個頁面。走得通的路,蜘蛛大概率也走得通;只能靠脚本或表單才能到達的地方,把它当成額外通道,不要当成主路径。
連結寫法不是為了多塞几個入口,而是為了让重要頁面有一條稳定、可被反复引用的路径。a 标簽之外的寫法可以保留,但別让它們成為唯一入口——那是把抓取交给了自己控制不了的東西。