先给结论:能不能發現,取决于它是不是真的“連結”
搜尋蜘蛛從入口頁發現 URL,靠的是解析 HTML 里的 a 标簽加 href 属性。凡是能還原成這個结构的寫法,都有被發現的机會;還原不出来的,基本不會被当成連結處理。图片、按钮、表單之所以让人困惑,是因為它們在浏览器里都能“点击跳轉”,但對解析器来说完全是另一回事。
图片連結:外面有 a 才有連結
- 用 a 标簽包住 img,並且 a 的 href 指向目标 URL:href 是标准連結,和普通文字連結一样會被解析。
- 只寫 img 的 src 指向目标 URL:這是引用图片资源,不是連結,蜘蛛不會把它当成頁面地址去跟進。
- 用图片热区(map 加 area 的 href)做入口:href 属于連結,理论上可解析,但结构复杂,實际跟進情况通常不如普通 a 稳定。
按钮:button 不是連結
button 元素和 input type=button 都不是連結元素,即使绑定脚本里寫着跳轉地址,也不属于 HTML 解析阶段的連結發現范围。用 CSS 把 a 标簽做成按钮外观是可以的,因為底层還是 href;用真正的 button 元素再靠脚本跳轉,就回到了“連結由脚本生成”的老問题。
判断标准很简單:把頁面 HTML 抓下来,在源碼里搜尋目标 URL。搜不到,就不要指望搜尋蜘蛛從連結层面發現它。
表單:action 一般不算可跟進的連結
表單的 action 是提交地址,通常不作為普通連結跟進。GET 表單的 action URL 偶尔會被收錄,但這不是可依赖的机制,POST 表單更不會。把目标頁做成表單提交後的结果頁,等于把發現路径交给了用戶行為,而不是連結结构。
常见的“看起来能跳轉但抓不到”寫法
- 按钮用 onclick 跳轉:源碼里没有 href,只有脚本事件。
- 用 div 或 span 加点击事件:没有連結语义。
- 图片入口只给 img 的 src,外面没有 a 包裹。
- a 标簽的 href 寫成 javascript:void(0),真實地址藏在 data 属性里。
- 按钮提交表單後 302 到目标頁,中間隔了一层 POST 請求,蜘蛛一般不會主動去走。
想被稳定發現,可以怎么改
- 優先用 a 标簽,href 寫完整地址,不要依赖脚本再拼接路径。
- 需要按钮样式时,用 a 加 class 做外观,不要用 button 元素代替連結。
- 图片入口保留外层 a,图片的 alt 寫清目标頁主题,便于人工核對。
- 让服務端直接輸出連結,避免首屏 HTML 里没有、靠脚本补上。
- 連結位置尽量靠近正文区域,頁脚堆叠、隐藏层或折叠面板里的連結,被發現的机會通常更低。
怎么驗證改完是否生效
不要在浏览器里点一下能跳轉就認為没問题,要看源碼和日誌:
- 查看頁面源代碼(不是右键检查元素後的 DOM),確認目标 URL 出現在 href 中。
- 關閉 JavaScript 後打開入口頁,看連結是否還存在于 HTML 里。
- 在服務器日誌里观察入口頁被抓之後,是否出現對目标 URL 的請求,注意两者時間可能相隔數小时到數天。
- 如果長期只有入口頁被抓、目标頁没有任何請求记錄,先回到連結寫法本身排查,而不是急着增加入口頁數量。
需要說明的是,連結寫法正确只解决了“可被發現”這一步。是否抓取、什么时候抓取、抓取後如何處理,仍由搜尋引擎自己决定,任何入口頁都無法保證结果。把结构寫規范,是為了不给自己制造無谓的障碍。