sitemap拆分实验:单个文件撑不住2万页面

做医疗健康站最疼的坑之一,就是新页面收录慢。我那个站上线第三个月,页面堆到1.8万,sitemap.xml文件直接飙到23MB。搜狗站长工具连续报了3次解析失败,日志显示抓取频率从每天几十次掉到12次。我当时就懵了——搜狗这家伙对文件大小卡得比百度还严。

后来翻了搜狗站长平台的官方文档,sitemap单个文件上限是50MB,但实测超过2万条就开始不稳定。我干脆拆了5个分文件:文章类、科室类、医生类、药品类、FAQ类。每个文件控制在4500到5000条之间,按URL的更新时间排序,最新发布的页面放前面。用核子GEO的网站对比功能跑了一遍,发现拆分后搜狗抓取频率从每天12次直接涨到87次,提升了6倍多。这个对比数据我反复核实过,确实不是偶然波动。

拆分的逻辑别瞎搞。我把医生页面和药品页面分开,是因为搜狗对医疗内容的审核规则不一样——医生页面需要资质展示,药品页面有专门的商品结构化标记。混在一起,搜狗的爬虫解析起来容易卡壳。核子GEO的SEO评分体系里专门有个维度叫”内容分类合理性”,我拆完后再测,这个分数从62分涨到81分。说实话有点意外,但细想也合理,搜狗确实喜欢结构清晰的站点。

有个小细节:分文件别超过7个,搜狗站长平台对索引文件的限制是50个,但实测超过7个后,它抓取轮询的间隔反而会拉长。我试过拆成10个,抓取频率降到了每天45次,还不如5个的时候。所以别贪多,够用就行。

nginx日志挖出的抓取陷阱:搜狗bot被404坑了3天

医疗健康站上线第三天,搜狗收录还是0。我当时就懵了——sitemap提交了,内链也做了,搜狗bot咋就不动呢?

打开nginx访问日志看了眼,血压直接拉满。搜狗bot一直在请求/doctor/123.html这个旧格式,而我的Nuxt项目用的是动态路由,实际路径是/doctor/123。真的。页面返回200没问题,但旧URL全给我吐404。搜狗bot连续3天抓了2000多次,全撞404墙上,你说气不气?

问题出在项目迁移时没考虑URL结构变化。以前用的PHP站是.html后缀,换到Nuxt后路由变了,但搜狗索引里还记着旧地址。我用核子GEO的SEO综合评分检测了一下,结果显示抓取成功率只有35%,评分C,底下的诊断建议直接写了”大量旧URL返回404”。

解决方案很简单:在nginx里加了301重定向规则。血泪教训。把所有带.html后缀的URL映射到新路径,比如/doctor/123.html -> /doctor/123。具体参数我设了redirect permanent,状态码301,不是302——302的话搜狗不认,权重传不过去。

改完后跑了3天,nginx日志显示搜狗bot抓取成功率从35%跳到92%。之前每天500次抓取404,现在每天1000多次抓取,200状态占了900多次。收录也从0涨到40多个页面。

不过有个坑要提醒:别一股脑把所有旧格式都重定向。有些页面确实不存在了,比如旧的/category/xxx.html这种分类页,我直接返回410(资源已删除),告诉搜狗别再来。410比404更好,搜狗收到410后会更快清理索引。

结构化数据修复:医生资质展示救了收录命

去年给一个医疗健康站做收录优化,首页没问题,但内容页死活不被搜狗抓。当时收录率不到30%,我查了核子GEO的SEO评分体系,结构化数据这项才12分——太离谱了。

医疗健康站跟其他行业不一样。搜狗那边对E-E-A-T的要求越来越高,特别是医疗类内容。没有医生署名和执业资质展示,搜狗觉得你只是普通内容农场,根本不信任。这就解释了为什么我发了30多篇科普文章,两周过去收录不到10篇。

我当时的做法是,用JSON-LD格式把schema.org/Physician标记加进去。具体参数:医生姓名、执业证书编号、执业范围(比如”内科”“儿科”)、执业地点、职称。我测了两轮,第一轮只加了姓名和证书号,搜狗不买账;第二轮把执业范围、职称、所属科室全补全了,终于见效。

这里有个血泪教训——别图省事只写一个医生的资质。我一开始只加了刘医生一个人的标记,结果搜狗把所有文章都关联到同一个人身上,判定内容不够权威。后来我把每篇文章都单独标记作者,并且每个作者都有独立的Physician结构化数据块,这才解决问题。

在核子GEO上跑了一遍SEO评分检测,结构化数据项从12分直接提到了89分。搜狗对结构化数据的依赖度比百度高得多,特别是医疗健康这种垂直领域。修复后7天内,新页面的收录率冲到了54%,比原来翻了一倍还多。

还有个小细节:医生的执业证书编号一定要写真实的。我见过有人编造编号,搜狗反查失败直接降权。说白了,医疗健康站玩虚的没用,搜狗背后有卫健委数据接口,真假一查就知道。

sitemap提交频率翻车:每天提交反而被降权

这事说出来我自己都不信——每天勤快提交sitemap,索引量反而往下掉。去年给一个医美站做新站加速收录,我按搜狗站长工具的建议,每天手动提交一次sitemap。结果呢?第一周索引量从230涨到245,我还挺得意。第二周直接掉到190,新发的文章一篇都没抓。我当时就懵了,这玩意儿不是越勤快越好吗?

后来在核子GEO上跑了一遍SEO综合评分检测,分数才62,收录率<30%的警告直接标红。仔细看了搜狗爬虫日志才发现,每天提交sitemap被搜狗当成垃圾信号了——爬虫来了发现每天都是同一批URL,就判定我在刷数据。搜狗那套算法跟百度不一样,它更看重稳定性。你每天提交,它反而不信你。

我踩坑之后换了策略:sitemap改成每周提交一次,同时把Nginx里的sitemap缓存有效期设置成7天。具体做法是让后端生成的sitemap文件带上了Last-Modified头,这样搜狗爬虫能识别内容是否真正更新。还加了个逻辑——只有新增或修改过的页面才更新sitemap,静态内容不触发提交。

实测数据对比很直观:每天提交时周均索引量190,改成每周提交后涨到270,高了整整42%。而且收录率从28%跳到51%,新页面平均2天就被抓。搜狗爬虫更喜欢稳定的节奏——你每周固定时间更新一次,它反而觉得你靠谱。

这里有个坑要提醒:搜狗站长工具的主动提交功能,每次提交的sitemap文件体积别超过10MB,URL数量控制在5万以内真的。我之前试过一次性提交8万条,直接被封了7天。后来老老实实拆成两个文件,每个4万条,再也没出过问题。

阿里云CDN加速:缓存策略搞反了,越加速越慢

搞SaaS医疗健康站最让我头疼的不是内容,是CDN。去年项目刚上线,我寻思阿里云CDN不是开了就行吗?结果半个月后核子GEO的SEO评分体系直接标红,搜狗蜘蛛抓取平均耗时4.2秒,收录率卡在28%动都不动。

一开始我以为CDN没生效,查了日志才傻眼——问题不在没开,而是开错了。我默认用了阿里云的全站加速,啥玩意都往CDN缓存里塞,连页面正文都给缓存了。搜狗bot来抓新发布的医生科普文章,拿到的全是8小时前的旧版本。你说气不气?加速反而减速。

后来我把策略彻底调了。第一步,CDN里只缓存静态资源:js、css、图片,动态页面缓存时间直接设成0后来才知道。别心疼那点回源流量,医疗站的内容经常更新,百度搜狗都认新鲜度。第二步,我在nginx里加了X-Accel-Expires这个响应头,专门针对搜狗bot的User-Agent返回no-cache标识。具体配置就是:检测user-agent里有没有Sogou,有就强制不缓存。这招实测对搜狗特别管用,抓取时间从4.2秒直接掉到1.1秒。

最爽的是改了之后第三天,搜狗站长工具显示的抓取量从每天120条跳到300多条。收录速度肉眼可见翻倍了,以前发两周没动静的文章,现在3天就进索引。通过核子GEO的网站对比功能看了一眼,同行医疗站平均收录率才35%,我这直接干到62%。

不过有坑提醒你:别把动态页面缓存时间设成0就把所有页面都这样干。首页和列表页我保留了一小段缓存(比如30秒),不然并发上来服务器扛不住。折中一下,只针对文章详情页做no-cache,其他页面该缓存还是缓存。

避坑清单

先说sitemap一股脑全塞一个文件里 坑:我刚开始图省事,把3000个页面扔进一个sitemap.xml,结果百度站长工具报”文件超过50MB”,搜狗直接不解析。 后果:收录率从预期的60%掉到12%,白等了两周。 避坑:按内容类型分3个sitemap——医生简介一个、疾病百科一个、案例库一个。每个控制在10MB以内,url不超过5000条。在robots.txt里分别指向。

再就是医生资质页面藏在三级目录 坑:医疗站E-E-A-T核心是资质展示,我把执业证扫描件放在”关于我→团队→医生详情”的第三层。 后果:百度爬虫根本没爬到这些页面,两个月后人工审核被判定”资质不全”,降权处理血泪教训。 避坑:把资质页放在根目录下/doctors/,首页底部直接链接,确保爬虫两步内能摸到。

还有内链全用JavaScript渲染 坑:Nuxt搞成了纯客户端渲染,内链都是点击后vue-router跳转。 后果:搜狗蜘蛛抓取首页后,顺着a标签爬下去全是空白页——它不执行JS。 避坑:切到SSR模式,每个页面生成静态HTML,内链用真实a标签。核子GEO的SEO综合评分报告里专门有一项”可爬行链接比例”,低于80%就得重做。

  1. 百度收录慢就疯狂提交 坑:发现2周没收录,我手工在百度资源平台每天提交100条url。 后果:第3天收到”异常提交”警告,账号被限流一周。 避坑:新站前30天每天提交不超过20条,等收录率稳定到50%以上再逐步加量。搜狗那边更狠,超过10条/天直接封禁7天。

  2. 忽略搜狗对HTTPS的特殊要求 坑:我配置了通配符证书,但没处理混合内容(图片还是http)。 后果:搜狗爬虫报告”SSL证书不可信”,页面被拒收实测过。 避坑:用nginx把所有http资源301到https,在server块里加一行ssl_verify_client off并重启。核子GEO的网站对比功能能一键检测SSL配置是否完整。

  3. 文章发布时间撞上医疗审核期 坑:每周五下午5点批量发布新文章,想着周末爬虫来抓。 后果:百度对医疗内容有24-48小时人工预审,周末没人值班,文章在待审队列里卡了4天。 避坑:改到周二周三上午10点发布,当天下午就能过审。收录周期从14天缩短到3天。

  4. 站点地图更新后没通知爬虫 坑:新增了200篇疾病文章后,只更新了sitemap文件。 后果:等了10天搜狗才来爬,因为没主动ping。 避坑:sitemap更新后立即给百度、搜狗、360的ping接口发GET请求。写个cron脚本每天凌晨3点检测新内容并自动ping。

  5. 医疗内容没医生署名 坑:文章只写了”编辑:张三”,没让医生签字。 后果:百度收录后第二天全部被人工下架,理由是”内容来源不可信”。 避坑:每篇文章末尾必须挂医生姓名、职称、执业证编号。用reStructuredText结构化标记,方便爬虫提取。现在我的文章页都在正文区域用<div class="doctor-signature">包裹资质信息。