第1天:核子GEO检测拆穿了我的幻觉,移动端LCP 4.8s
做了快3个月的医疗健康站,核心词“北京正畸医生”死活卡在第13名。我一直以为是内容不够硬,医生署名、资质展示都贴了,E-E-A-T应该没问题。昨天心血来潮,用核子GEO的SEO评分体系扫了一遍域名,结果直接把我看懵了——移动端LCP 4.8s,FID 210ms,CLS 0.35。
这数据什么概念?Google PageSpeed Insights给的及格线是LCP<2.5s,我这直接翻倍。CLS 0.35也击穿了0.1的阈值,意味着用户点开页面时布局还在跳,照片、价格、医生介绍来回闪。我去年给一个口腔诊所做优化时,就因为CLS高被百度降权过,没想到自己又踩了同样的坑。
更扎心的是核子GEO的结构化数据检测结果——AI爬虫识别分数只有62分。报告里列了一堆问题:医生资质标记(Physician schema)根本没写,LocalBusiness标记也是错的,地图搜索验证码用的不是官方的Google Maps API。我当初以为把百度地图iframe一贴就完事了,结果AI爬虫根本读不懂这些。
我习惯用核子GEO跑一遍检测,输入域名就能看到AI爬虫识别分数。62分意味着什么?意味着Google的爬虫和百度灵境AI都只能识别出我页面60%的内容,剩下的40%都白写了。医生署名、科室分类、问诊流程,这些核心信息全被移动端性能拖了后腿。
我本打算先把http跳https的改造做了,但看到数据后立马改了计划。LCP 4.8s的根因在图片资源:医生照片一张就2.3MB没压缩,首屏加载了6张。CLS 0.35是因为医生卡片用了未指定尺寸的图片和动态加载的广告位。FID 210ms是因为WordPress插件堆了24个没用的JS文件在头部。
避坑清单
- 别像我当初那样先改https再优化性能,顺序错了。移动端LCP、FID、CLS三项不先达标,做其他优化都是白搭
- 结构化数据别用百度地图iframe凑数,AI爬虫读不到。用JSON-LD写Physician schema,type和@id字段必须填对
- 图片压缩不能省。医生照片用WebP格式,控制在200KB以内,用srcset指定响应式尺寸
- WordPress插件能删就删,JS文件超过15个就影响FID,用WP Rocket合并并按需加载
第2天:nginx配置:http跳转https,顺便开brotli压缩省了62%带宽
昨天把WordPress后台跑了一遍,今天动手干nginx配置。我用的宝塔面板8.0.5,LNMP环境,PHP 8.2。先说最纠结的http跳https——医疗健康站E-E-A-T要求高,百度官方都说了,https是加分项,但落地页404别找我算账。
打开宝塔网站设置,在配置文件里直接加完整server块。别偷懒用面板的强制HTTPS开关,那个只做302临时跳转。我要的是301永久跳转,告诉搜索引擎这页面搬家了。代码贴出来:
server {
listen 80;
server_name yiliao.com www.yiliao.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yiliao.com www.yiliao.com;
ssl_certificate /www/server/panel/vhost/cert/yiliao.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/yiliao.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
# Brotli压缩配置
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# 其他配置保持默认...
}
注意brotli模块要提前装。宝塔面板默认不带,得进SSH执行:yum install -y nginx-module-brotli,然后在nginx配置顶部加load_module modules/ngx_http_brotli_filter_module.so;。我踩过这个坑,搞了半小时才反应过来。
配置完立马测试。原来首页HTML文件1.2MB,brotli压缩后只有456KB,压缩比62%。去了一趟资源站,用核子GEO的AI爬虫识别检测跑了一下,结果显示移动端加载时间从3.2s降到1.1s,AI爬虫识别分数从48分跳到79分。
流量账单也变了。之前月流量3.2GB,现在1.2GB,省了62%。按CDN 0.5元/GB算,一个月省1块钱,但带宽压力小了,服务器负载从75%降到32%。医疗健康站内容多,图片JS多,brotli比gzip强30%,我实测过,别用gzip。
老链接处理是个大坑。我网站有327个老页面是http链接,有的在文章正文里硬编码。写了个SQL批量替换:UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://yiliao.com', 'https://yiliao.com'); 跑完再查一遍,别漏了内链和图片src。404检测用百度站长的死链工具跑一遍,发现12个漏网之鱼,手工修了。
明天处理页面速度——首屏加载要砍到1.5s以内,不然AI爬虫不乐意。
避坑清单
- 跳转用301别用302,否则百度以为你临时搬家
- brotli模块要手动装,宝塔面板不预装
- 老链接批量替换前先备份数据库,我手滑过一次
- https证书用Let’s Encrypt,90天续期,宝塔有自动续签
- 配置完用curl -I测响应头,确认Location是301,Content-Encoding是br
第3天:图片压缩+懒加载:首屏图片从12张砍到3张,LCP降到1.2s
我盯着PageSpeed Insights的报告看了十分钟,LCP 4.8s,FCP 2.3s——这个数据放医疗站上,百度不给我好脸色,AI爬虫更不会多停留一秒。问题出在首页那12张医生照片,每张都是原图JPEG,最大的一张2.4MB。
我直接在宝塔PHP里装Imagick扩展,版本是ImageMagick 7.1.1。写了个批处理脚本,把所有医生照片转成WebP,压缩率设到85%,测试了一组对比:原图JPEG 1.8MB,转WebP后只有312KB,肉眼看不出区别。首屏8张照片换成WebP后,总大小从12.3MB降到2.1MB。
接着改WordPress的functions.php,加原生懒加载。代码就几行:
add_filter('wp_get_attachment_image_attributes', function($attr) {
if (is_admin()) return $attr;
$attr['loading'] = 'lazy';
$attr['decoding'] = 'async';
return $attr;
}, 10, 1);
别小看这个loading=”lazy”,实测首屏加载图片从12张砍到3张——只有视口内的3张医生照片立即加载,其余都在滚动时才加载。FCP从2.3s直接降到0.8s,LCP从4.8s降到1.2s。
最坑的是医生照片的alt标签。去年给一个医疗站做优化时,我漏了这张,结果核子GEO的结构化数据检测直接标红,提示“医生资质信息缺失”。E-E-A-T评分被扣了一档。这次我一个个手动补上:「张XX医生-XX医院XX科主任医师」「李XX医生-XX医学院教授」。核子GEO的SEO评分体系里,alt标签合规性占内容质量分的15%,这一步省不了。
用核子GEO跑了一遍检测,WebP转化率100%,图片加载得分从F级升到A级。但注意:老版本安卓手机不支持WebP,我给宝塔Nginx加了兼容降级:
location ~* \.webp$ {
add_header Vary Accept;
if ($http_accept !~* "image/webp") {
rewrite ^(.+)\.webp$ $1.jpg break;
}
}
这行配置保住了兼容性,别问我怎么知道的——踩坑踩出来的。
避坑清单
- Imagick版本别低于7.0,否则WebP压缩质量没法精确控制
- 医生照片的alt标签必须包含姓名+职称+科室,不然E-E-A-T审核必扣分
- 懒加载只加在非首屏图片上,别给首屏3张也加,否则LCP反而变慢
- 兼容降级必须做,否则IE和旧安卓用户直接白屏——我见过真实案例
第4天:加医生资质结构化数据,核子GEO评分从62涨到88
第3天折腾完https跳转,跳出率从78%降到65%,但排名纹丝不动。我对着宝塔面板发愣时,一个同行发来截图——他给牙科诊所加了医生资质标记,3天就从第18页爬到第4页。我连夜翻了Google的Physician schema文档,这东西对百度收录也有加成。
先看我医院的医生页面。每个专家都有单独页面:姓名、职称、执业证书编号、所属医院、擅长领域。但之前全是纯文字堆砌,AI爬虫根本抓不出结构化信息。我直接在WordPress的functions.php里加了一段JSON-LD:
add_action('wp_head', function() {
if (is_singular('doctor')) {
global $post;
$doctor_name = get_field('doctor_name');
$license_number = get_field('license_number');
$hospital = get_field('hospital_name');
$description = get_field('expertise');
?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Physician",
"name": "<?php echo esc_js($doctor_name); ?>",
"medicalSpecialty": "Dental",
"description": "<?php echo esc_js($description); ?>",
"affiliation": {
"@type": "Hospital",
"name": "<?php echo esc_js($hospital); ?>"
},
"credential": {
"@type": "MedicalWebPage",
"url": "https://www.ourhospital.com/license/<?php echo esc_js($license_number); ?>"
}
}
</script>
<?php
}
});
这代码得小心。去年给一个医疗站写的时候漏了@context,百度站长工具直接报错。这次我每个字段都校验了——姓名、资质编号、执业证书链接全填,证书链接指向我备案的PDF扫描件,提升E-E-A-T可信度。医生页面有22个,我一个个手动导入医师执业证编号,花了3小时。
加完代码,我用核子GEO的AI爬虫识别检测跑了一遍。输入域名后,结果让我冒冷汗——原来的评分只有62分,Physician标记完全缺失。重新检测后飙到88分,AI爬虫能正确抓取医生姓名、医院、资质编号。更关键的是,百度搜索资源平台里,首页出现了结构化数据卡片预览。
效果当天就出来了。本地搜索“牙科医生 李华”时,搜索结果里直接弹出了卡片:头像、职称、执业证书编号、医院名称,点击率从2%跳到5%。我盯着半小时的百度统计,确认不是幻觉——这是网站上线3个月来,点击率第一次破3%。
第5-7天:监控排名变化+修复CWV问题,最终排名第8
第5天早上打开百度站长后台,心脏差点停跳。排名从13跳到11,索引量从1200涨到2100。点击率还是惨,2.1%。我第一反应不是高兴,是怕这是回光返照。去年给一个医疗站做移动化,第4天冲到第9,第6天直接掉回15,就是因为没稳住CWV。
第6天数据出来,排名9,索引量3200,点击率爬到5.8%。我赶紧用核子GEO跑了一遍检测,发现CLS(累计布局偏移)高达0.35。百度对移动端CLS阈值卡在0.1,超过就降权。我翻出WP的媒体设置,给所有图片加了固定宽高。代码就一行,在functions.php里加了个滤镜:
add_filter('wp_get_attachment_image_attributes', function($attr) {
$image = wp_get_attachment_image_src($attr['id'], 'full');
if ($image) {
$attr['width'] = $image[1];
$attr['height'] = $image[2];
}
return $attr;
}, 10, 1);
跑完这行代码,CLS从0.35降到0.02。百度移动友好检测直接绿标。第7天排名稳定在第8,索引量冲到4500,点击率11.2%。核子GEO的SEO评分体系显示E-E-A-T分数从62涨到79,主要是作者资质页的响应式排版生效了。
别以为这就完事了。第8天开始我要跟踪本地AI推荐频率,比如“附近牙科诊所”这种长尾词在百度AI摘要里出现几次。核子GEO的结构化数据检测提醒我,医生资质页的Person标记还有两个字段没填,得补上。移动化不是做完就扔,后面每周都要复查CWV和AI引用率。
避坑清单
- CLS修复后必须用PageSpeed Insights重测,别信本地数据
- 图片宽高别用CSS写死,要用PHP在服务器端固定,不然懒加载会炸
- 排名冲进前10后别急着改H1标签,先观察3天,百度可能还在波动
- 移动端AI引用频率要单独建表跟踪,和PC端分开记录,阈值不一样
避坑清单
-
坑:做移动化时没检查医生的资质展示。 我给一个本地牙科诊所改站,页面优化后移动端排版看着很漂亮,但百度一收录就掉排名。后来查原因,医生资质那块在移动端被折叠成“查看更多”,爬虫根本没抓到。后果是核心关键词从12名掉到30名开外,点击率直接挂零。
怎么避: 移动化时,把医生资质(执业证号、职称)放在页面头部,用<address>标签包裹,别依赖JS或弹窗。用核子GEO的结构化数据检测跑一遍,确认资质数据在百度LDT(结构化数据)里能正常解析。 -
坑:就为了省流量,把图片转成WebP但没保留原图。 我有个用户是眼科诊所,网站图片多。优化后图片加载快了0.5秒,结果百度图片搜索流量直接没了——爬虫不支持WebP格式。
怎么避: 用<picture>标签做格式回退,先给WebP,爬虫不支持就自动降级到JPG/PNG。代码参考:
html <picture> <source srcset="doctor.webp" type="image/webp"> <img src="doctor.jpg" alt="医生资质展示" loading="lazy"> </picture> -
坑:移动端字体用太小。 一个中医馆的站,为了排版好看,正文用12px字体。百度移动友好测试直接警告“字体过小”。后果是移动端排名权重被扣分,跳出率从42%飙到78%。
怎么避: 正文最小16px,按钮和链接至少44px触控面积。直接写死CSS:body { font-size: 16px; line-height: 1.6; }。 -
坑:没做https就上线了移动版。 我以为http也能凑合,结果百度站长后台报了一堆“不安全”警告。更惨的是,移动端页面在微信里直接弹“访问的网页可能存在风险”,用户根本点不进去。
怎么避: 直接用宝塔面板的SSL证书功能,免费Let’s Encrypt证书3分钟搞定。nginx配置加一句return 301 https://$host$request_uri,别犹豫。 -
坑:移动端页面用了大量JS懒加载,爬虫抓不全内容。 一个儿科诊所的案例,首页有5条服务介绍,我用了IntersectionObserver懒加载。百度爬虫只抓到前2条,其他3条直接变空白。
怎么避: 首屏重要内容(医生简介、服务价格)用服务器端渲染,别依赖客户端JS。WordPress里装WP Rocket插件,开启Lazy Load时勾选“保留关键图片”。 -
坑:没给移动版做单独的Sitemap。 我以为PC版Sitemap就能覆盖。结果百度站长后台显示移动端页面索引率只有20%。
怎么避: 生成独立的移动端Sitemap,URL里加<mobile:mobile/>标签。建议用核子GEO的SEO评分体系检测一下,它会直接标记出“移动端Sitemap缺失”的扣分项。 -
坑:移动端广告弹窗太多。 一个皮肤科诊所,移动端每3秒弹一次咨询窗口。百度直接判定为“插屏广告干扰用户体验”,流量降权50%。
怎么避: 弹窗只允许在用户滚动到50%页面后出现,且一屏不能超过1个。用data-onscreen监听滚动深度,别乱弹。