做蜘蛛池或站内运营时,為了让搜尋蜘蛛發現目标 URL,很多人會尝试各種寫法:有的把地址塞進表單的 action,有的直接寫成正文里的纯文本,有的藏在 data-* 属性或 JS 變量里。這些寫法在浏览器里可能点得動、跳得過去,但對搜尋引擎的 URL 發現来说,效果差別很大。
先区分两件事:用戶能跳轉,不等于蜘蛛能發現
浏览器和抓取器的行為逻辑不同。浏览器可以执行 JS、提交表單、点击绑定了事件的元素;抓取器主要依據 HTML 源碼里的标准連結结构,来判断“這里有一個新 URL”。一個地址只要没進入抓取器認可的連結入口,就很难排進待抓取队列。
通常會被当作連結處理的寫法
- <a href>:最标准,正文里的普通連結是 URL 發現的主力。
- sitemap 與 HTTP Link 响應头:属于主動声明,抓取器會讀取。
- 301/302 的 Location:跳轉目标會被记錄下来。
- link rel 系列标簽:canonical、alternate 等會传递 URL 信息,但用途不同,別把它当導航用。
這几類可以理解為“正式入口”。除此之外的寫法,大多需要額外條件才生效。
容易被漏掉的几種寫法
form 的 action
表單 action 指向的地址,一般不會被当作可發現的頁面連結。它更像功能入口,抓取器缺少“提交之後會發生什么”的上下文。如果目标 URL 只出現在這里,被發現的概率很低。
正文里的纯文本 URL
把地址直接寫在段落里、不加 a 标簽,多數情况下不會被自動轉成跟踪連結。少數工具會做识別,但不能当可靠方案,也無法控制它出現在哪個頁面、什么位置。
img、script、link 等资源地址
這些位置會触發资源抓取,但抓取器把它們当资源處理,未必會作為 HTML 頁面進入頁面發現流程。用图片去带目标頁,效果遠不如正文里的 a 标簽。
data-* 属性與 JS 變量里的字符串
把 URL 寫進 data-url 或脚本變量,需要渲染执行後才會生成真實連結。是否被發現,取决于抓取器是否渲染、渲染後連結是否進入可抓路径。稳定性差,出問题时排查成本也高。
area 元素
带 href 的 area 属于标准超連結,理论上可被识別,但實际使用少、坐标和路径容易配错,也是常见的漏網位置。能用 a 标簽就別用 area。
相對路径與 base 标簽
連結寫成相對路径时,解析结果受頁面地址和 base 标簽影响。如果 base 指到別的目錄,本来有效的連結可能被解析成错誤 URL,抓取器訪問到的就是 404。批量生成的入口頁尤其容易踩這個坑。
怎么自检入口頁有没有把連結“寫對”
- 查看頁面源碼,確認目标 URL 以 href 形式出現在 HTML 里,而不是只存在于脚本中。
- 用抓取模拟工具,或在禁用 JS 的情况下請求入口頁,看返回源碼里是否還有目标連結。
- 在搜尋资源平台的 URL 检查工具里,查看入口頁的渲染结果和识別到的連結列表。
- 翻服務器日誌,確認搜尋蜘蛛請求過入口頁,之後有没有繼續請求目标 URL。
- 如果是批量模板生成的入口頁,随机抽几個頁面核對,不要只看首頁那一個样本。
實務上的做法
連結發現這件事,越接近标准 HTML 越省事。把目标 URL 放在正文的 a 标簽里,保證它在未渲染的源碼中就存在,再配合 sitemap 声明,是相對可控的组合。表單、纯文本、属性里藏地址這些做法,可以当补充,但不要作為主要依赖。
連結能被發現,只是進入抓取队列的第一步。是否抓取、抓取频率、最终是否收錄,還受站点质量、抓取配額、内容重复度等多重因素影响。任何寫法都不保證收錄或排名,能做的只是减少技術层面的漏發現。