做蜘蛛池入口頁时,很容易踩一個坑:頁面看上去有連結,但搜尋蜘蛛根本没把它当成連結。問题往往不在連結指向哪里,而在連結是怎么寫出来的。
搜尋蜘蛛识別連結,先看 HTML 源碼
抓到一個頁面後,第一步是拿到 HTML 源碼。在這一步里能被稳定识別的連結形式,基本只有 a 标簽加 href 属性。锚文本是什么、在頁面里長什么样,都不影响能不能顺着爬,只要 href 能被解析出来就行。
JS 渲染後才出現的連結就不一样了。不少搜尋引擎會做二次渲染,但這件事並不免費:渲染要排队、要消耗額外资源,而且不保證每個頁面都會被渲染。所以「渲染後能看到」不等于「一定能被抓到」。
几種常见寫法,實际表現差別很大
1. 纯文本 URL
頁面上直接寫 example.com/page 這種形式,對人有用,對蜘蛛則属于不确定信号。部分搜尋引擎會做 URL 抽取,但這是附加能力,不是标准行為,也不保證會進入抓取队列。把它当作辅助提示可以,当成主要的連結来源不可靠。
2. 用 JS 拼接或動態插入
例如先取變量拼成地址,再插進 DOM。這種連結在原始 HTML 里根本不存在,必须等渲染。入口頁本身如果抓取预算已经很吃紧,再叠加渲染成本,往往得不偿失。
3. onclick、button、data-href
這些是交互寫法,搜尋蜘蛛不會把它們当成連結。用戶点了能跳,蜘蛛看到的却不构成一條可爬的路。
4. 图片、CSS 背景图、图标按钮
图片的 src 是资源請求,不是頁面連結。除非外面包了 a 标簽,否則不算一條可跟随的連結。
想让連結被稳定识別,按這几條来
- 使用标准的 a 标簽加 href 属性,href 寫成完整可訪問的地址。
- 連結尽量出現在原始 HTML 中,不要依赖渲染後才生成。
- 不要用 JS 跳轉替代 a 标簽,那属于用戶行為,不是連結信号。
- 同一頁面里同類連結別堆太多,宁可少而稳定。
- 連結所在頁面自己能正常返回 200 且内容可解析,否則後面的事都無從谈起。
几個容易想当然的誤区
「頁面上明明寫了 URL,為什么日誌里看不到蜘蛛来?」先確認那個 URL 是不是真的以 a 标簽形式存在,而不是一段文本或 JS 變量。
- 以為文本里出現 URL 就等于给出了連結。
- 以為渲染後的 DOM 和原始 HTML 在蜘蛛眼里是一回事。
- 以為連結放在彈窗、折叠块、Tab 里,蜘蛛也會点開——它不点,只是解析。
折叠内容如果本来就寫在 HTML 里,通常還能被解析到;但如果是点击後才异步加载的,性质就完全變了。
怎么驗證
- 用抓取工具或命令行取一次原始 HTML,禁用 JS,看連結在不在源碼里。
- 對比渲染前和渲染後的 HTML,判断有多少連結依赖渲染才能出現。
- 查自己入口頁的訪問日誌,確認搜尋蜘蛛是否請求過那些目标 URL。没有請求,就先別急着怀疑索引問题。
入口頁的作用是把路径铺好,铺得越标准,蜘蛛越省事。寫法上的小差別,有时候就是「能被發現」和「發現不了」之間的分界线。