很多蜘蛛池入口页在浏览器里看起来很正常,链接、按钮、列表都在,但蜘蛛拿到的 HTML 源码里可能什么都没有。原因通常只有一个:内容是被 JavaScript 或者 iframe 拼出来的。对蜘蛛来说,入口页的价值就是能不能从这里发现下一条 URL,如果链接只存在于渲染之后,发现效率就会明显打折扣。
蜘蛛优先拿到的是初始 HTML
搜索引擎抓取一条 URL 时,第一步是请求并解析服务器返回的 HTML 源码。JS 渲染通常排在后面的阶段,需要排队、消耗抓取预算,也可能因为某个资源加载失败而中断。入口页这类只为发现链接而存在的页面,把关键链接放在初始 HTML 里,是最省事的做法。
哪些写法容易让链接消失
- 用 JS 拼接 DOM 再插入链接,源码里只剩一段脚本。
- 用 onclick 或事件监听做跳转,没有真实的 href。
- 把链接写在 iframe 里,尤其是跨域 iframe。
- 图片或列表用懒加载,地址放在 data-src、data-href 属性上。
- 用 display:none 或 visibility:hidden 隐藏链接,指望蜘蛛照样计入。
前几条属于蜘蛛看不到,最后一条属于蜘蛛可能看得到但不认,两种都在浪费入口页。
iframe 不是不能用,但别当主力
蜘蛛对 iframe 的处理比普通链接差:需要额外请求,跨域内容可能被忽略,即便能跟进,也不如页面里一条直接的 a 标签干脆。如果入口页必须用 iframe 承载列表,建议在 iframe 外面再放一份等价的纯链接列表,或者至少让每条目标 URL 都有一个可直达的 href。
改造思路:能直出就不要依赖渲染
- 服务端渲染,让链接直接出现在返回的 HTML 里。
- 使用真实 a 标签和完整 href,不用 JS 事件代替跳转。
- 首屏链接不做懒加载,需要滚动才出现的放到后面几屏。
- iframe 内容用直链列表兜底,两者指向同一批 URL。
- 最后用 sitemap 补一层发现路径,降低对页面解析的依赖。
怎么验证蜘蛛看到了什么
不要用浏览器开发者工具里的元素面板判断,那看到的是渲染后的 DOM。正确做法是查看网页源代码,或者用 curl 直接请求一次,检查返回的 HTML 里有没有目标链接。也可以临时禁用 JS 打开页面,看还剩多少可点的链接。如果禁用 JS 后页面几乎是空的,蜘蛛大概率也是同样的体验。
入口页的核心任务不是好看,而是让链接出现在最容易被抓到的位置。渲染是给用户看的,源码是给蜘蛛看的,两者至少在链接这件事上要保持一致。
几个使用建议
- 入口页尽量保持静态优先,模板里避免堆砌前端框架。
- JS 渲染可以用,但只做增强,不要成为唯一的链接出口。
- 定期抽查:随机抽几条入口页,用 curl 对比源码里的链接数与预期是否一致。
- 如果发现蜘蛛只抓入口页不往下走,先排查链接是否真的写在源码里。
入口页做得再花哨,蜘蛛看不到链接就只是空转。把链接放回 HTML 源码中,往往比优化渲染方案更有效。