10 月 5 号上午,客户打来电话,说百度收录从 400 多条掉到 30 多条。

他那个站是做机械配件的,上线五年,没做过黑帽,没买过链接。我先让他把百度搜索资源平台的后台截图发过来。上面有一条警告:页面存在隐藏文本。

我当时第一反应是被挂马了。这种事见过太多次,小企业站,安全做得松,被人植入了暗链,隐藏的 div 里塞满赌博关键词,百度绿萝算法扫一遍,整站降权。

然后我花了两天时间排查。发现的问题比想象中复杂。不是挂马,是三处自己人留下的坑。

第一处:响应式改造时留下的两套文案。

这个站原来只有 PC 端。去年客户找了个外包做移动端适配,外包的方案是两套内容加 CSS 控制显示。

什么叫两套内容?就是同一个页面,HTML 里写了两份文案。一份给 PC 端看,比如「公司成立于 2008 年,主要生产液压配件」。一份给移动端看,比如「创立于 2008 年,专注液压配件生产」。然后在 CSS 里写媒体查询,PC 端隐藏移动端的段落,移动端隐藏 PC 端的段落。

用户看不到,但 HTML 里两份都在。百度爬虫抓 PC 版的时候,看到的是那些被 display:none 隐藏的移动端文案。

我扒了一下那个页面,被隐藏的文本加起来有 6000 多字。里面「液压配件」出现了 80 多次,「液压」出现了 200 多次。

百度绿萝算法 2013 年就上线了,专门抓这种。判定逻辑很简单:页面上看不见但对爬虫可见的文本,就是隐藏文本,就是作弊。

外包当初怎么想的呢?他觉得两套文案是省钱方案,不用重写内容,改改 CSS 就行。他不知道爬虫读的是 HTML,不是渲染后的页面。

第二处:广告位的 text-indent。

这一处更隐蔽。我排查的时候顺手用检测工具跑了一遍,工具报告里除了那 6000 多字,还有一处 text-indent: -9999px。

我一开始以为是挂马。点开源码一看,是个装饰条里的 span 标签,里面写了一句:「液压配件厂家,液压配件价格,液压配件批发」。

text-indent: -9999px 是什么效果呢?就是把文字往左移 9999 像素。用户屏幕上完全看不到,但 HTML 里还在。

这是 2010 年前后流行的黑帽 SEO 手法,叫文字缩进隐藏。当年很多站用这个堆关键词,百度绿萝算法第一批打击的就是它。

我问客户,客户说不知道。再追查,是 2019 年找过一个做 SEO 优化的个人接的活,那个人给他加了这个。后来那个人微信都找不到了。

我把这段代码截了个图发给客户。客户愣了半天,说这看起来就是一个装饰条啊。是的,用户看到的就是顶部一个深色的横条,横条上写着「机械配件」四个字,剩下的文字全被移到屏幕外了。

第三处:旧模板残留。

第三处是我排查到最后才发现的。当时我已经把上面两处都清理了,提交百度重新抓取,但搜索资源平台还是报隐藏文本。

我有点想不通,又把整个首页 HTML 保存下来,用 Python 脚本把所有 display:none 和 visibility:hidden 的元素提取出来。

结果出来了一个 div,id 叫 temp-old-header,里面是一段旧版页头的内容,包括一句:「XX 机械,专业液压配件厂家,20 年经验」。

这个 div 在 CSS 里是 display:none。页脚还引用了一个 script,是 2018 年那次改版的残留,这个 div 是被那个脚本动态创建出来的。

模板升级没删干净。开发人员为了稳妥,把老代码临时保留下来,想着以后可能用得上,结果一留就是五年。

三处都找到了,修复不像看起来那么简单。

第一处:如果只是删掉一份文案,那移动端或者 PC 端就没内容了。最终我改了布局方案,只保留一份通用文案,用 CSS 的媒体查询控制字号和排版,而不是控制内容显示隐藏。这样两端都有内容,爬虫也只读到一份。6000 多字砍成 800 字。客户一开始还担心内容不够,我说你先看百度反应。

第二处:直接删掉那个 span 标签。客户说装饰条要保留,我说保留横条,删文字。

第三处:找到那个 temp-old-header 的创建脚本,注释掉整段。然后把相关的 CSS 也删了。

三处改完是 10 月 7 号晚上。我做了两件事。提交百度搜索资源平台的抓取诊断,然后手动提交 sitemap。

10 月 22 号,客户发来消息,说百度收录从 30 多涨到了 200 多。

再过一周涨到 380。原来的 400 多是历史峰值,现在基本恢复。搜索资源平台的隐藏文本警告也消失了。

排名恢复得慢一些。客户最在意的「液压配件厂家」这个词,从第 5 页回到第 2 页,用了差不多三周。

这不是修复隐藏文本带来的直接效果,而是隐藏文本解除后,百度重新信任了整站。

如果你收到过隐藏文本警告,或者怀疑页面有问题,按这个顺序排查。

第一,打开首页源代码,Ctrl+U 就是源码。搜 display:none,看有没有内容型的 div。注意,装饰图标、加载动画用 display:none 是正常的,但如果里面是文案,就是问题。

第二,搜 text-indent: -9999,这个是最经典的黑帽手法。

第三,搜 visibility: hidden 和 position: absolute; left: -9999px。

第四,用检测工具跑一遍,重点看隐藏元素那一项。有些工具只报个数,你得自己去看具体是什么。

第五,看模板残留。搜 div id="temp、div id="old、div class="legacy。有时候旧代码会被一直留在页面里。

第六,如果是响应式改造过的站,检查是不是用了两套内容加 CSS 控制的方案。

最后一句:自己无意踩的坑比被人挂马更常见。特别是外包做过 SEO 优化、移动端适配的站,一定要自己扒源码看一遍。外包只保证功能,不保证合规。