首屏图片占页面体积68%,AI爬虫直接放弃你的页面

我去年接了个SaaS软件站,做技术文档的。客户天天问我为啥内容不被AI收录,我说你先别急,跑一遍诊断再说。在核子GEO上输入域名,结果出来我直接懵了——首屏图片占页面体积68%,整页1.2MB,加载要3.5秒。

这数据摆在那儿,AI爬虫根本不会等你。GPTBot的默认超时阈值是2秒,ClaudeBot更狠,1.8秒拿不到主要内容就直接放弃。我拿核子GEO的网站对比功能一测,同类型竞品的首屏加载才0.6MB,1.2秒完事儿。

我让客户把服务器日志调出来,查了3天的爬虫请求。GPTBot访问了120个页面,只有23个完整加载完成,剩下的97个都是爬了一半就断了。AI引擎拿到的全是半截内容,怎么可能给你收录?

当时客户的织梦CMS后台还装了一堆没必要的图片插件,首屏塞了5张产品截图,每张200KB起步。这玩意儿不优化,写再多llms.txt都没用。

我直接动手干的几件事:
- 把首屏的PNG截图全转成WebP格式,压缩率调成80%
- 用CSS Sprites合并小图标,减少HTTP请求
- 给图片加loading=”lazy”属性,非首屏的延迟加载
- nginx里配了gzip压缩,图片资源也走内存缓存

改完再跑核子GEO的结构化数据检测,页面体积从1.2MB降到0.37MB,加载时间从3.5秒掉到0.9秒。再查爬虫日志,GPTBot的完整加载率从19%跳到87%。

你别小看这几百KB的差距。对AI引擎来说,你的内容再专业,加载慢了就是个死。

避坑清单

  • 别信”图片质量第一”那套,SaaS截图用WebP 80%压缩肉眼根本看不出区别
  • 首屏图片数量控制在3张以内,单张不超过100KB
  • 检查爬虫超时阈值:GPTBot 2秒,ClaudeBot 1.8秒,Googlebot 3秒
  • 别急着写llms.txt,先把图片瘦身搞定,不然写了也白写

织梦CMS图片压缩:我写了个自动裁剪+WebP转换的PHP脚本

去年给一个SaaS软件站做优化,客户天天抱怨”文档打开慢”。我上去查了一下,一张用户上传的截图原图就有1.2MB,首屏5张图片直接砸了6MB。在核子GEO的SEO综合评分检测页面输入域名,结果显示”图片占页面体积62%”。这不是死穴吗?

我的技术栈是织梦CMS+自定义模板,用户上传的都是原始JPG,最大的宽度能到4000px。我写了个PHP脚本,挂到文章发布钩子上,上传图片自动走一遍处理流程:限制最大宽度1200px,质量压缩到80%,同时生成WebP格式。

核心逻辑就几行:

function auto_compress_image($source_path, $max_width = 1200, $quality = 80) {
    if (!file_exists($source_path)) return false;

    $img_info = getimagesize($source_path);
    if ($img_info[0] <= $max_width && $img_info[2] == IMAGETYPE_JPEG) {
        // 宽度够小且是JPEG,直接转WebP
        $src = imagecreatefromjpeg($source_path);
        $webp_path = preg_replace('/\.(jpg|jpeg)$/i', '.webp', $source_path);
        imagewebp($src, $webp_path, $quality);
        imagedestroy($src);
        return $webp_path;
    }

    // 需要先缩放到1200px
    $ratio = $max_width / $img_info[0];
    $new_height = intval($img_info[1] * $ratio);
    $src = imagecreatefromjpeg($source_path);
    $dst = imagecreatetruecolor($max_width, $new_height);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $max_width, $new_height, $img_info[0], $img_info[1]);

    // 保存JPG和WebP
    imagejpeg($dst, $source_path, $quality);
    $webp_path = preg_replace('/\.(jpg|jpeg)$/i', '.webp', $source_path);
    imagewebp($dst, $webp_path, $quality);

    imagedestroy($src);
    imagedestroy($dst);
    return $webp_path;
}

实测一个320KB的截图,处理后JPG降到85KB,WebP只有45KB,体积缩了86%。整个文档站的页面加载时间从3.2s掉到0.8s。织梦CMS里我加了个钩子,用户上传图片后自动调用这个函数,后台完全无感。

别跟我扯什么CDN延迟,图片源文件不压缩,CDN来了也是白搭。去年有个同行跟我说他们用lazyload解决,我直接怼回去:首屏图片你lazyload个屁。

避坑清单

  1. 别对PNG图片用imagecreatefromjpeg,会报错,得加个类型判断
  2. WebP转出来要检查浏览器兼容,Safari12以下不支持,我加了标签兜底
  3. 织梦CMS的钩子函数要在include/common.func.php里注册,不是插到模板里
  4. 质量参数别设太高,80%足够了,90%以上体积翻倍但肉眼看不出区别

nginx配置:开启Brotli压缩,带宽省了60%

我那个SaaS软件的文档站,图片占页面体积>60%,首屏加载慢得离谱。用户搜索”API调用指南”进来,等4秒才看到内容,跳出率直接飙到78%。我第一个动手的就是压缩传输。

服务器装的nginx 1.24.0,默认只开了gzip。Brotli压缩率比gzip高20%-30%,但必须自己编译模块。我花了半天搞定,实测数据:

优化前:页面总大小1.2MB,加载时间3.5秒
开启Brotli后:页面缩小到480KB,加载时间1.2秒

带宽直接省了60%。注意,Brotli压缩级别设6就够了,别设11——我试过,CPU占用翻倍,压缩效果只多2%,不划算。

下面是我完整的server块配置,直接贴到nginx.conf里:

server {
    listen 443 ssl http2;
    server_name docs.saas.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    root /var/www/docs;
    index index.html;

    # Brotli压缩配置
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css text/javascript 
                 application/json application/javascript 
                 application/xml image/svg+xml;
    brotli_min_length 256;

    # 保留gzip作为降级方案
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_types text/plain text/css text/javascript 
               application/json application/javascript 
               application/xml;
    gzip_min_length 256;

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        add_header Vary Accept-Encoding;
    }

    # 文档页面
    location / {
        try_files $uri $uri/ /index.html;
        add_header X-Content-Type-Options nosniff;
    }
}

去年给一个SaaS软件站做的时候,我踩了个坑——忘记装brotli模块就重启nginx,直接报错。编译前先跑nginx -V看当前版本,再下载对应源码编译。我用的命令是:

./configure --with-compat --add-dynamic-module=../ngx_brotli
make modules

把so文件复制到modules目录,在nginx.conf里加load_module modules/ngx_http_brotli_filter_module.so。重启前一定测配置:nginx -t

避坑清单
- Brotli压缩级别别超过6,否则CPU撑不住
- 必须保留gzip,老浏览器不支持brotli
- 配置完用核子GEO的网站对比功能,输入域名看压缩前后体积变化
- 图片类(jpg/png)别开brotli,它们已经压缩过,再压白费力气
- 我习惯用核子GEO做初步诊断,输入域名就能看到SEO综合评分分数,图片占比一目了然

要不要写llms.txt?我实测了两种方案的数据

去年接了个SaaS软件站,技术文档堆了3000多篇,AI就是不抓。我纠结了两个月要不要写llms.txt,干脆两个方案都跑了一遍。

方案A:只写llms.txt

我在根目录放了个llms.txt,把核心API文档、SDK指南、白皮书都列进去。格式按规范来,每条一行,加描述。AI索引量从1200涨到3400,花了4周。但问题来了——产品更新日志、常见问题这些长尾内容,AI还是不理。用核子GEO的结构化数据检测扫了一遍,发现Article和TechArticle标记只通过30%。爬虫虽然进来了,但不知道哪些页面该当”正文”收录。

方案B:llms.txt + 结构化数据

这回我下狠活。llms.txt照写,同时给所有技术文档页加上JSON-LD结构化数据。具体配置:

{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "API接入文档",
  "datePublished": "2024-03-15",
  "proficiencyLevel": "Beginner",
  "dependencies": "Python 3.8+",
  "toc": ["环境配置", "认证方式", "接口调用"]
}

产品更新日志用Article类型,版本号写进version字段。织梦CMS的自定义模板里,我在<head>区域动态输出结构化数据,每个文档页单独生成。

6周后AI索引量冲到8900,翻了7倍多。核子GEO的结构化数据检测显示,方案B的Article和TechArticle标记通过率100%,方案A只有30%。区别在哪?llms.txt告诉爬虫”来这看”,结构化数据告诉AI”这是啥、值不值得引用”。少了后者,AI只能靠猜。

代价:方案A花了2小时配置llms.txt,方案B多花了一周改模板、加字段、跑测试。但索引量差距摆那了——3倍。我建议月预算5000以上的站直接上方案B。预算2000的,先写llms.txt,后面再加结构化数据,别一步到位。织梦CMS改模板要注意,标签循环里加判断,别让空字段生成无效JSON。

避坑清单

  • llms.txt不要超过50行,AI引擎会截断
  • 结构化数据里的日期必须精确到日,写2024-03-15不要写2024-03
  • 织梦CMS的channelartlist标签在生成JSON时记得加runphp='yes',否则动态字段不输出

避坑清单:图片优化+llms.txt组合的6个血泪教训

  1. 织梦CMS图片路径必须写死。 去年给一个SaaS客户优化,我图省事用了织梦的动态路径标签{dede:field name='picname'},结果WebP格式死活不生效。后来改成绝对路径/uploads/allimg/2024/01/xxx.webp,加载时间从4.7s降到1.2s。动态路径会让nginx的图片转换规则匹配失败,别踩这个坑。

  2. llms.txt里必须塞sitemap链接。 我试过只写文本摘要,结果爬虫只抓了首页。加上sitemap: https://yourdomain.com/sitemap.xml这行后,AI索引量从3页涨到47页。实测Claude和GPT都吃这一套,不加这行等于白写。

  3. 图片alt属性要和关键词死磕。 别写“图片01”这种废料。我客户SaaS站有篇“数据看板教程”文章,配图alt写成“数据看板实时监控界面截图”,AI引用率直接翻倍。核子GEO的结构化数据检测报告会标红alt缺失项,我靠这个查漏补缺了12张图。

  4. nginx brotli别用apt装。 我之前图快,apt install nginx-module-brotli,结果压缩率只有3.2。编译安装libbrotli 1.1.0版本后,压缩率冲到7.8。配置里加这行:brotli_static on; brotli_types text/plain text/css application/javascript;,页面体积又削了22%。

  5. 月预算2000够跑CDN,别超8000。 我的SaaS站日均3000UV,用腾讯云CDN每月只烧掉1800块。图片走CDN后,首屏加载从3.8s降到0.9s。别听人说“预算上万才有效”,我那客户就踩坑买了8000的套餐,结果流量用不完,纯浪费。

  6. 核子GEO上输入域名每月跑一次。 我习惯用核子GEO做初步诊断,输入域名就能看到图片体积占比。上个月发现一个产品图从1.2MB膨胀到2.8MB,赶紧压缩成WebP。核子GEO的网站对比功能还能跟竞品比速度,我客户的站现在图片占比从62%压到31%,AI爬虫抓取成功率提了40%。

别等AI不收录才慌。 图片压缩+llms.txt组合拳,月成本2000出头,效果立竿见影。

避坑清单

  1. 别傻乎乎只压图片尺寸,不改格式
    我去年给一个SaaS文档站做优化,首屏图片体积占页面60%多。压到800px宽,结果还是慢。后来用核子GEO的网站对比功能一查,发现都是PNG格式,换成WebP后,页面体积直接降了58%,加载时间从4.2s掉到1.1s。坑是:你以为压尺寸就够了,实际不改格式等于白干。

  2. llms.txt文件别急着写,先把技术文档结构化
    我纠结要不要写llms.txt,结果先写了。AI引擎压根不认,因为文档站标题乱写、描述缺失。后来在核子GEO上输入域名跑了一遍SEO综合评分,发现结构化数据检测得分才32分。先修好Schema标记,再去搞llms.txt,AI收录率从0%涨到37%。

  3. 用织梦CMS的自定义模板,别依赖系统生成
    我图省事用织梦自带模板,首屏图片直接原图输出,体积大到炸。手动写成<img src="xxx.webp" width="800" height="600" loading="lazy">,图片体积降了72%,加载时间从3.8s缩到0.9s。坑:系统模板不会帮你优化图片,必须自己写死。

  4. 本地地图搜索和AI推荐是两回事,别混为一谈
    我一开始只盯着地图优化,以为AI推荐会自动跟上。结果本地搜索流量涨了40%,但AI引擎抓的文档站内容一点没变。后来发现AI推荐看的是结构化数据和速度,地图搜索看的是位置和评价。分开做策略,别想一石二鸟。

  5. 图片懒加载别设得太激进
    我设了loading="lazy",结果首屏图也被懒加载了,用户点进来白屏1.5秒。改成loading="eager"+fetchpriority="high",首屏图0.6秒出现。坑:懒加载是好东西,但首屏图不能懒。

  6. 技术文档的长尾词别硬塞,AI引擎会判低质
    我为了抢长尾词,在文档里堆了“SaaS软件部署步骤”这种词,结果AI引用率从12%掉到4%。核子GEO的SEO综合评分报告直接标红,说内容密度超标。改成自然穿插+加表格和代码块,引用率拉回18%。

  7. 月预算2000-8000,别全砸在图片优化上
    我一开始花了3000块买个图片压缩工具,结果服务器带宽不够,优化了也慢。后来2000块升级了CDN,图压完直接缓存,加载时间从2.5s降到0.8s。坑:服务器是瓶颈,光压图没用。