服务器后台Nginx访问日志中,Googlebot在10月12日凌晨3点15分至4点20分期间,发起了472次抓取请求。HTTP状态码显示403禁止访问的记录占比高达82%。静态生成的html目录下,15200篇新生成的行业问答文章处于未索引状态。搜索引擎控制台中“未找到页面”错误提示暴增了650条。问题直指根目录下一个仅有24字节的文本文件。
开发团队上周二提交的更新包体积为32MB,包含修改过的屏蔽指令。原本意图屏蔽wp-admin后台管理文件夹的指令,写成了通配符星号匹配。爬虫读取这条仅仅占用2行的指令耗时12毫秒。拦截动作发生得很彻底。蜘蛛程序接收到Disallow指令,中止了对html文件夹内按日期命名的子目录(如20231012/)的访问。
步骤一:清查当前生效的限制指令
打开网站主服务器FTP工具,定位到public_html主目录。找到名为robots的txt格式文档,文件创建时间显示为上周二下午14点30分,权限设置为644。用Notepad++文本编辑器打开,内部代码共计5行。
文本内的常见错误写法排查清单:
User-agent参数后误跟具体蜘蛛IP段
Disallow斜杠后缺失具体文件夹名称
Allow指令位置放错引发规则被覆盖
Sitemap文件指引地址拼写少了一个字母s
采用全角字符打出了错误的冒号占位符
Linux CentOS 7.6系统下,管理员输入cat命令查看抓取记录。屏幕上滚动显示着一排排抓取痕迹。9月15日之前,存放新闻列表的静态文件夹news_list每日能贡献700个以上的索引量。自从技术部把带参数的php程序生成的页面转换为纯静态的html文件,存放位置更改为/static_news/。配置文件里的指令没跟上变动。旧的屏蔽规则把带有static字样的目录统统拦在门外。
修改这条指令仅敲击几下键盘。光标移动到第3行。把Disallow冒号后面的/static/改成/admin_static/。文件大小从256字节变更为264字节。保存上传覆盖原文件。传输耗时0.1秒。
步骤二:比对异常抓取日志
下载当日大小为1.2GB的access.log文件。使用grep命令过滤含有Googlebot的行。提取出发生屏蔽行为的页面数量为850个。状态码404的请求有15个,状态码200的仅有3个主页请求。抓取频次从上个月的日均4500次暴跌至不到300次。爬虫停留时间缩短到不足2秒。
一家销售工业机床的独立站,商品详情页多达35000个。SKU编号从A001排到Z999。上个月服务器响应时间从平均300毫秒延长到了1500毫秒。运维人员在根目录文本里添加了一段长达40行的爬虫限制代码。意图拦截名为AhrefsBot的第三方分析工具抓取,保护服务器带宽。第17行代码手滑多打了一个通配符。
这一处笔误,让原本应该被放行的Baiduspider面临无差别拦截。商品静态页面的收录数在两周内从28000条掉落到12000条。自然搜索带来的每日800个访客锐减至150个。订单询盘量单日下降了45%。
抓取日志异常数据比对表:
| 爬虫标识 | 日期 | 请求总数 | 403状态码占比 | 200状态码占比 | 耗时(ms) |
| Googlebot | 10-14 | 5200 | 88.5% | 1.2% | 1450 |
| Bingbot | 10-14 | 3100 | 91.2% | 0.8% | 1200 |
| YandexBot | 10-14 | 850 | 99.0% | 0.0% | 890 |
| Baiduspider | 10-14 | 4600 | 85.4% | 3.5% | 1600 |
步骤三:验证配置生效情况
面对不同开发语言环境下的文件存放位置,排查方式大不相同。WordPress搭建的站点,虚拟主机面板中的文件管理器是操作入口。根目录下可能找不到实体存在的那个文本文件。名叫Yoast或者RankMath的插件,会在内存中虚拟生成屏蔽指令。进入WordPress后台设置菜单,点击阅读选项卡。勾选了“建议搜索引擎不索引本站点”的复选框。该设定会在虚拟输出的代码里强制加上屏蔽所有爬虫的指令。取消勾选这个小框,只需1秒钟。
独立开发的Java网站架构中,Tomcat服务器的webapp目录下,前端页面被打成了war包。开发人员把测试环境的屏蔽文件打包进了生产环境。发布上线的那个晚上11点30分,包含全站屏蔽指令的文件覆盖了线上版本。第二天早上8点,监控软件发出警报,全站抓取量跌至0。解压war包,找到WEB-INF同级目录下的那个文件。用Vim编辑器删掉含有User-agent: * 与 Disallow: / 的那两行。重新打包耗时3分钟,重启Tomcat服务耗时45秒。
日志分析软件GoAccess呈现出一目了然的图表。绿色的成功抓取线在修改完毕后的第4个小时开始抬头。晚上8点,单小时抓取量恢复到1500次。页面访问大小合计达到350MB。
搜索引擎官方站长指南明确建议:任何对抓取规则的修改,修改幅度不宜超过原文件体积的20%,避免引发爬虫信任度重新评估。文件内容大小控制在500KB以内,包含的指令行数建议不超过200行。
SaaS建站平台内,商家无法接触到服务器底层的文件夹结构。店铺后台的主题代码编辑器里,有一个专门的robots.txt.liquid模板文件。代码行数多达85行。其中第42行写着过滤搜索结果页面的指令。商家为商品添加了25种属性的分类标签。带有颜色与尺寸标签组合的网址链接产生了多达14万个重复页面。
爬虫在抓取带有问号与等号的参数网页时,浪费了每天分配给该域名的3000次抓取配额。真正的静态化博客文章存放于/blogs/news/目录下,共计240篇原创长文,每篇字数都在1500字以上。抓取配额被耗尽,这240篇文章在一个月内仅仅被蜘蛛访问了12次。收录率仅为5%。
进入模板编辑器,在第45行敲入限制爬虫访问特定参数的指令。阻止含有tag=与sort_by=的网址链接被抓取。保留对/blogs/目录的完全开放状态。提交保存指令发出后的第3天,后台数据显示,分配给静态博客文章的抓取频次上升到了每天60次。
网站迁移至新服务器的实操细节。旧服务器使用的是Apache环境,.htaccess文件负责处理伪静态规则。新服务器更换为Nginx引擎,配置规则写法完全变样。重写规则写错,导致原本呈现为html后缀的静态文章页面,在爬虫眼中返回了500服务器内部错误。状态码监控面板上,红色柱状图在一天内飙升到了4500次。
管理员耗时2个小时排查Nginx的conf配置文件。在第128行找到了location语块中的目录匹配错误。把try_files指令后面的参数调整正确。重新加载Nginx配置文件,耗时3秒钟。刷新状态面板,500错误停止增加。返回200状态码的成功记录每分钟增加25条。静态目录的收录重新步入正轨。
内容管理系统织梦DedeCMS的后台设置中,生成静态HTML是一个常用功能。每次发布新文章,系统会在根目录下的/a/文件夹里生成按日期命名的子文件夹。网站运营人员把一套开源模板上传至服务器。模板附带的屏蔽规则里,赫然写着不允许抓取/a/目录。
整整半年时间,该站点发布的4500篇行业资讯,文字量累计达到300万字。庞大的数据在搜索引擎的索引库里数量为零。FTP软件连接到云服务器,IP地址为121.xx.xx.45,端口22。下载那个2KB大小的文本文件。把Disallow: /a/ 这一行整行删除。顺带把底部包含Sitemap指向的XML文件地址补全。该XML文件体积为4.5MB,包含了5000条标准静态网页地址。
上传覆盖后,打开浏览器,按下F12键调出开发者工具。切换到Network网络面板,按下F5刷新页面。查看该文本文件的加载状态,HTTP响应头信息显示缓存控制为max-age=86400,缓存有效时长达到24小时。旧版本的屏蔽规则依旧存在于各大搜索引擎的抓取缓存库中。必须主动出击,进入各自的站长工具后台,找到对应的测试工具。点击强制刷新缓存按钮,系统反馈清理完成耗时0.5秒。
跨国多语言站点的配置细节。网站根目录下部署了四个语言版本的子文件夹:/en/、/fr/、/ja/、/de/。为了防止翻译不完全的日语版本被提前抓取,技术人员添加了针对/ja/目录的屏蔽代码。日语版翻译工作在11月1日全面完工,1200个静态页面全部通过了人工校对。屏蔽代码在原处停留了整整45天。
负责监控流量的运营人员查看GA数据报表,来自日本地区的自然搜索流量为零。排查指令文件,找到了那行孤零零的Disallow: /ja/。将其修改为Allow: /ja/,文件修改时间戳变更为12月15日早上9点12分。到了12月18日,监控软件显示,来自东京的爬虫IP段66.249.xx.xx发起了单日850次抓取请求。日语页面的索引量在3天内突破了500个。
移动端与PC端分离部署的架构。PC端域名为www开头,移动端采用m前缀的二级子域名解析。移动端的服务器根目录下,配置存在疏漏,照搬了PC端的屏蔽文件。文件内包含了大量仅适用于PC端特定带参数页面的拦截规则。移动端有350个精心优化的AMP加速静态页面。页面的加载时间缩短到了0.8秒内。
拦截代码把350个极速页面拒之门外。运维人员登录阿里云控制台,进入云解析DNS面板。核对m前缀子域名的A记录指向的服务器公网IP为47.93.xx.xx。通过SSH终端登录该服务器,执行vim命令打开对应的文件。清空多余的35行拦截代码,仅保留最底层的爬虫声明与Sitemap地址。输入:wq保存退出,整个过程耗时4分30秒。
图文资讯站点的图片存放目录引发的抓取问题。文章主体内容是纯静态化的HTML文件,存放在/article/目录下。每一篇文章内部引用的配图,全部存储在/images/uploads/目录下。为了防止别有用心的人批量下载图片,运维在规则文件中屏蔽了整个/images/目录。
该配置导致爬虫在抓取静态文章页时,无法渲染页面内的图片元素。文章页面的文字占比不到30%,高质量图解占据了70%的信息量。无法读取图片的网页被搜索引擎判定为内容空洞的低质量页面。排名掉落至第15页开外。
修改规则文件,加入对图片后缀的放行指令。新增5行Allow代码,分别针对.jpg、.png、.webp、.gif、.svg五种主流图片格式。放开对特定图片格式的限制,保留对整个目录内其他可能存在的敏感文件的封禁状态。修改后的一周内,百度图片搜索带来了每日超过400次的点击量,带动了所在文章静态页面的权重回升。
Discuz论坛静态化改造案例。论坛拥有85万注册会员,历史发帖量达到150万条。管理员开启了全局伪静态功能,所有的forum.php动态链接全被重写为形如thread-12345-1-1.html的静态格式。服务器硬盘上并没有真正生成150万个html文件。依靠Nginx的rewrite规则进行实时转换。
在这个转换过程中,一条拦截指令阻断了收录通道。根目录下的文本里,历史遗留的规则限制了所有带有减号的网址链接。150万个帖子无一例外全部命中了这条拦截规则。百度站长后台的抓取频次图表显示,长达三个月的时间里,蜘蛛抓取量每天维持在可怜的50次上下。每日发帖量高达2000篇,收录量是个位数。
技术主管接手问题排查。登录服务器宝塔面板,定位到网站根目录。双击打开那个1.5KB大小的规则文件。把带有减号的通配符拦截规则注释掉,在行首加上一个井号键。顺畅的抓取通道被重新打开。第四天,百度蜘蛛的抓取量飙升到了每天12万次。服务器CPU占用率从平时的15%跃升至65%。150万个历史帖子的收录量在一个月内突破了45万条。论坛日均IP访问量增加了8000个。
大型资讯门户网站的CDN节点配置差异。主服务器位于北京机房,带宽100M。全国部署了15个阿里云CDN加速节点。运维工程师在主服务器上更新了放行静态文章目录的屏蔽规则,文件体积从3KB变成了3.1KB。CDN节点上的缓存刷新时间设定为每7天自动回源一次。
长达6天的时间差里,华南、华东等地区的搜索引擎爬虫节点访问到的,依然是含有拦截指令的旧版文件。北京地区的少量爬虫抓取成功,占比不到10%。华南地区爬虫返回的依然是403禁止访问状态码。
登录CDN控制台,找到缓存刷新功能模块。在URL输入框内填入规则文件的绝对路径。点击提交按钮执行全网节点手动刷新。日志监控屏幕上,15个CDN节点的旧文件在30秒内被全部清除。各地的爬虫节点发起的请求统一返回了200状态码,读取到了那份3.1KB的新版放行规则。
企业官网产品说明书下载页面的误拦截。官网提供PDF格式的重型机械说明书,单文件大小在15MB至50MB之间。防盗链设置将存放PDF的/download/目录加入了拦截名单。产品展示的纯静态化HTML页面刚好放在了/download/html/这个子目录下。拦截指令采取了前缀匹配原则。
250个详尽的产品静态介绍网页受到了波及。外链建设团队在外部行业论坛发布了300多条引流信息。外部流量涌入,搜索引擎爬虫跟随外链爬行而来。在/download/html/的门口被拦截规则无情阻挡。外链建设投入的15000元预算没有换来任何自然索引的增长。
调整匹配文件层级的精度。将Disallow的参数修改为严谨的 /download/*.pdf。只限制对大体积PDF文件的抓取,放行所有的HTML静态页面。两行代码的微调,挽救了250个高质量产品页面的收录命运。单页面的文字描述多达2500字,附带15张高清细节图,精心打磨的原创内容顺利进入搜索引擎索引库。
前端采用React前端技术开发的PWA单页应用。通过Next.js实现了服务端渲染,输出了750个带有完整标签的静态化商品页面。构建打包生成的文件存放在/.next/目录下。开发者习惯性地把以圆点开头的文件夹加入了全站屏蔽名单。
Googlebot抓取时,无法读取到打包产出的样式表CSS文件与JS脚本文件。渲染出来的网页在爬虫眼里是一堆排版错乱的纯文字。渲染失败势必导致收录停滞。抓取工具的截图预览界面显示,精美的商品排版变成了一列黑白文字列表。
进入GitHub代码仓库,找到根目录下的那个限制规则文档。新增两行代码,声明对/.next/static/css/ 与 /.next/static/js/ 两个具体子目录的开放权限。提交Commit,触发自动化部署流程。3分钟后,新版文件同步到了生产环境服务器。爬虫抓取渲染预览图恢复了图文并茂的正常页面。750个静态页面的索引状态从“已发现-目前尚未编入索引”变更为“已编入索引”。
验证配置生效的检查清单:
对比修改前后的文件字节数变化
用命令curl读取返回的HTTP头信息
检查CDN节点是否存在24小时以上的旧版缓存
调取Nginx的access.log查找Googlebot字样
站长工具内部的实时网址检验结果状态变动