☰
GEO实战指南:从爬虫抓取到内容结构,让AI搜索引用你的网站
2026/10/14 14:41:45 网站建设 项目流程

1. 当AI搜索对你的网站视而不见时,问题出在哪

你有没有遇到过这种情况:辛辛苦苦写了一篇自认为质量不错的文章,发到网站上,传统搜索引擎收录得也挺好,但去AI搜索里问一个相关的问题,它引用的全是别人的内容,你的网站连个影子都没有。你换着法子问,结果还是一样。这时候大多数人第一反应是“我的内容不够好”或者“AI搜索还没收录我”,但实际情况往往比这更具体——AI搜索的爬虫可能压根就没抓到你,或者抓到了但没读懂,又或者读懂了但觉得不值得引用。

这就是GEO(Generative Engine Optimization,生成式引擎优化)要解决的问题。它和传统SEO有交集,但底层逻辑差别很大。传统SEO的核心是“让搜索引擎的爬虫抓到你的页面,并在关键词排名里给你一个好位置”,而GEO的核心是“让AI搜索的爬虫能顺利抓取你的内容,并且让大模型在生成回答时愿意引用你的内容作为依据”。前者拼的是排名,后者拼的是被引用。

这篇文章适合几类人看:一是做内容站、博客、独立站的站长,发现AI搜索流量一直起不来;二是做技术文档、产品手册的团队,希望自己的文档能被AI搜索直接引用;三是前端或全栈开发者,想从代码层面理解并解决“AI搜索不引用我”的问题。我会从爬虫抓取、内容结构、代码配置三个层面拆开讲,每个环节都给出可以直接复制使用的代码和配置,并且解释清楚为什么这样做有效。

在进入具体操作之前,先建立一个基本认知:AI搜索的引用链路大致分为四步——发现、抓取、解析、引用。任何一步断了,你都不会出现在最终的回答里。大多数人只盯着“引用”这一步,觉得是内容质量问题,但实际上前三步的代码和配置问题才是更常见的瓶颈。下面我按这个链路逐层拆解。

2. 先搞清楚AI搜索爬虫到底能不能进你的门

2.1 robots.txt里那些容易被忽略的拦截规则

很多网站的robots.txt是从建站模板里直接复制过来的,里面可能包含一些看似无害但实际上会挡住AI爬虫的规则。比如有些模板会写Disallow: /然后只放开几个目录,或者用通配符把某些路径全部屏蔽。传统搜索引擎的爬虫可能因为历史收录关系还能进来,但AI搜索的爬虫是后来者,一旦被挡就彻底没机会。

你需要做的第一件事是打开自己网站的/robots.txt,逐行检查。重点看三类规则:第一,是否有User-agent: *下面的Disallow把重要目录屏蔽了;第二,是否有针对特定爬虫的Disallow规则;第三,是否有Crawl-delay设置得过大导致爬虫放弃。

一个常见的误区是认为“我没有写针对AI爬虫的规则,所以它们应该能进来”。实际上,如果User-agent: *下面有Disallow: /,那所有没被单独允许的爬虫都会被挡住。正确的做法是显式地给主流AI搜索爬虫放行。下面是一个可以直接参考的robots.txt片段:

User-agent: * Allow: / Disallow: /admin/ Disallow: /private/ Disallow: /tmp/ User-agent: GPTBot Allow: / User-agent: ClaudeBot Allow: / User-agent: PerplexityBot Allow: / User-agent: Google-Extended Allow: / Sitemap: https://yourdomain.com/sitemap.xml

这里的关键点是:先给所有爬虫一个合理的默认规则,然后针对AI搜索爬虫单独放行。注意Google-Extended这个UA,它控制的是Google的AI训练和AI搜索引用权限,如果你希望被Google的AI搜索引用,需要允许它。另外,Sitemap这一行很重要,它告诉爬虫你的站点地图在哪里,能大幅提升发现效率。

注意:不要直接复制上面的域名,把yourdomain.com换成你自己的域名。另外,如果你的网站有CDN或WAF,robots.txt的规则可能被CDN层的规则覆盖,需要去CDN控制台确认。

2.2 服务器日志里藏着爬虫被拒的真相

改完robots.txt之后,你怎么知道AI爬虫到底来没来?最直接的方法是看服务器访问日志。如果你用的是Nginx,日志通常在/var/log/nginx/access.log;如果是Apache,在/var/log/apache2/access.log或/var/log/httpd/access_log。

用下面这条命令可以快速筛选出AI爬虫的访问记录:

grep -iE "GPTBot|ClaudeBot|PerplexityBot|Google-Extended|Bytespider" /var/log/nginx/access.log | tail -50

如果这条命令返回空结果,说明AI爬虫根本没来过。这时候你要检查两件事:一是robots.txt是否真的生效了(可以用curl https://yourdomain.com/robots.txt确认返回内容);二是服务器防火墙或CDN是否有额外的拦截规则。有些云服务商的默认WAF规则会把“未知爬虫”直接拦掉,需要手动加白名单。

如果日志里有记录但状态码是403或429,说明爬虫来了但被拒绝了。403通常是权限问题,429是频率限制。对于429,你需要检查Nginx的limit_req配置或者CDN的速率限制规则,把AI爬虫的IP段加白。主流AI搜索爬虫的IP段可以通过官方文档查到,但更稳妥的做法是基于User-Agent做放行,因为IP段会变。

2.3 用curl模拟爬虫做一次完整的抓取测试

日志分析是事后排查,更主动的做法是用curl模拟AI爬虫的请求,看看服务器返回什么。下面这条命令模拟GPTBot访问你的首页:

curl -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.0; +https://openai.com/gptbot" -I https://yourdomain.com/

重点看返回的HTTP状态码和响应头。如果返回200,说明服务器正常响应;如果返回403,说明有权限拦截;如果返回301或302,说明有重定向,需要确认最终落地页是否可访问。另外要看Content-Type是否正确,如果返回的是text/html但实际内容是JavaScript渲染的空壳,那爬虫抓到的就是空页面。

这里有一个容易被忽略的点:很多现代前端框架(React、Vue、Angular)的页面是客户端渲染的,服务器返回的HTML里只有一个空的<div id="app"></div>,真正的内容靠JavaScript加载。传统搜索引擎的爬虫现在大多能执行JavaScript,但AI搜索的爬虫不一定有这个能力。如果你的网站是这种架构,AI爬虫抓到的就是空页面,自然不会有引用。

3. 让AI爬虫读懂你的内容,而不只是抓到

3.1 服务端渲染与静态化:给爬虫一份能直接读的HTML

接上面的话题,如果你的网站是客户端渲染的,最彻底的解决方案是改成服务端渲染(SSR)或静态站点生成(SSG)。对于已经上线的项目,全量重构成本太高,可以用预渲染(prerendering)作为过渡方案。预渲染的原理是在构建时或请求时,用无头浏览器把页面渲染成完整的HTML,然后返回给爬虫。

以Nginx为例,可以通过判断User-Agent来决定是否走预渲染服务。下面是一个简化的配置思路:

map $http_user_agent $is_bot { default 0; ~*GPTBot 1; ~*ClaudeBot 1; ~*PerplexityBot 1; ~*Google-Extended 1; } server { listen 80; server_name yourdomain.com; location / { if ($is_bot) { proxy_pass http://prerender-service:3000; } try_files $uri $uri/ /index.html; } }

这个配置的意思是:当请求来自AI爬虫时,转发到预渲染服务,返回渲染好的HTML;普通用户访问时走原来的前端路由。预渲染服务可以用prerender、rendertron或自己用Puppeteer写一个简单的服务。这样改造成本低,效果立竿见影。

如果你用的是Next.js、Nuxt.js这类框架,本身就支持SSR或SSG,确保部署时用的是服务端渲染模式而不是静态导出模式即可。检查方法是直接curl你的页面,看返回的HTML里有没有实际内容。如果只有<div id="__next"></div>,那就是客户端渲染,需要调整。

3.2 结构化数据:让AI一眼看懂你的页面在讲什么

AI搜索在解析页面时,会尝试理解内容的语义结构。如果你在HTML里埋了Schema.org的结构化数据,相当于给AI递了一份“内容说明书”,它能更快地判断你的页面主题、作者、发布时间、内容类型,从而决定是否引用。

最通用的做法是使用JSON-LD格式,把结构化数据放在<script type="application/ld+json">标签里。下面是一个针对技术文章的示例:

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "GEO实战指南:AI搜索引用优化", "description": "从爬虫抓取、内容结构、代码配置三个层面讲解如何让AI搜索引用你的网站", "author": { "@type": "Person", "name": "你的名字" }, "datePublished": "2025-01-15", "dateModified": "2025-01-20", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://yourdomain.com/geo-guide" }, "proficiencyLevel": "Expert" } </script>

这段代码告诉AI搜索:这是一个技术文章,标题是什么,作者是谁,什么时候发布的,专业程度如何。别小看这些信息,AI搜索在决定引用来源时,会优先选择结构清晰、信息完整的页面。实测下来,加了结构化数据的页面被引用的概率明显高于没加的。

除了TechArticle,常用的类型还有HowTo(教程类)、FAQPage(问答类)、Product(产品页)、Documentation(文档页)。选择最贴合你内容类型的Schema,不要滥用。另外,dateModified要真实更新,不要为了“显得新鲜”而频繁改日期,AI搜索有办法识别这种操作。

3.3 llms.txt:一个专门给大模型看的导航文件

llms.txt是最近一年逐渐被AI搜索和大模型厂商认可的一个约定文件,放在网站根目录下,作用类似于给大模型看的“站点地图+内容摘要”。它不是强制标准,但越来越多的AI搜索爬虫会主动去读这个文件,用来快速了解你的网站有哪些高质量内容。

一个完整的llms.txt写法如下:

# 你的网站名称 > 一句话描述你的网站是做什么的 ## 核心内容 - [文章标题](https://yourdomain.com/article-1): 一句话说明这篇文章讲什么 - [文章标题](https://yourdomain.com/article-2): 一句话说明这篇文章讲什么 - [文档页面](https://yourdomain.com/docs): 一句话说明这个文档覆盖什么 ## 可选内容 - [关于我们](https://yourdomain.com/about): 团队和背景介绍 - [联系方式](https://yourdomain.com/contact): 商务合作渠道

这个文件的写法有几个要点:第一,用Markdown格式,因为大模型对Markdown的解析能力最强;第二,每个链接后面跟一句话描述,这句话要具体,不要写“点击查看”这种废话;第三,把最重要的内容放在前面,因为大模型的上下文窗口有限,不一定会读完整个文件。

llms.txt和sitemap.xml的区别在于:sitemap是给传统爬虫用的,只列URL;llms.txt是给大模型用的,除了URL还有内容摘要和优先级。两者不冲突,建议都放。实测下来,放了llms.txt的站点,AI搜索爬虫的抓取频率和引用率都有提升。

4. 内容层面的GEO:让大模型愿意引用你

4.1 问答式结构为什么比长篇大论更有效

AI搜索在生成回答时,本质上是在做“信息检索+内容重组”。如果你的文章里有一个清晰的问答结构,大模型在检索到你的页面后,可以直接提取答案段落,引用成本极低。相反,如果你的文章是那种“娓娓道来”的长篇散文,大模型需要自己总结和提炼,引用意愿就会下降。

具体怎么做?在文章的关键段落,用<h2>或<h3>直接提出问题,然后在紧接着的段落里给出简洁的答案。比如:

<h2>GEO和SEO有什么区别?</h2> <p>GEO关注的是被AI搜索引用,SEO关注的是关键词排名。前者拼引用率,后者拼排名位置。</p>

这种结构在HTML层面是清晰的标题+段落,在语义层面是问题+答案。AI搜索爬虫解析时,能直接建立“这个问题对应这个答案”的映射。当用户在AI搜索里问类似问题时,你的答案段落就有更大概率被直接引用。

另外,答案段落要尽量控制在2-3句话以内,不要超过100字。太长的答案大模型会截断,太短的答案信息量不够。这个长度是实测下来引用率最高的区间。

4.2 数据、引用和原创观点:AI搜索判断“值得引用”的信号

AI搜索在决定引用哪个来源时,会评估内容的“可信度”和“独特性”。如果你的文章只是把别人的内容重新组织一遍,没有新增信息,那大模型没有理由引用你而不是原始来源。要提升被引用概率,需要在内容里加入三类信号:

第一类是具体数据。比如“实测下来,加了结构化数据的页面被引用概率提升了约40%”就比“结构化数据能提升引用率”更有说服力。数据不需要多精确,但要有来源和场景说明。

第二类是引用和参考。在文章里引用权威来源、官方文档、学术论文,并给出链接。这不仅能提升内容可信度,还能让AI搜索在追溯信息源时顺带发现你的页面。

第三类是原创观点和经验。比如“我在实际配置中发现,Nginx的map指令比if指令更可靠,因为if在location块里有已知的兼容性问题”这种就是典型的经验型内容,别的地方抄不到,大模型只能引用你。

这三类信号不需要每段都有,但在文章的关键位置至少各出现一次。AI搜索的引用决策不是二元的,而是概率性的,信号越多,被引用的概率越高。

4.3 页面加载速度和可访问性对AI爬虫的隐形影响

这一点经常被忽略:AI搜索爬虫的抓取预算(crawl budget)是有限的,如果你的页面加载太慢或者经常超时,爬虫会降低对你网站的抓取频率,甚至放弃。传统搜索引擎对慢速页面有一定的容忍度,但AI搜索爬虫通常更“没耐心”。

优化方向有三个:第一,确保服务器响应时间在200ms以内,可以用CDN加速静态资源,用缓存减少数据库查询;第二,压缩HTML、CSS、JavaScript,减少传输体积;第三,避免在页面加载时执行大量同步JavaScript,这会阻塞爬虫解析。

检查方法很简单,用curl -w命令看各个阶段的耗时:

curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" -o /dev/null -s https://yourdomain.com/

如果TTFB超过500ms,就需要优化服务器端。如果Total超过3秒,就需要检查资源加载。AI爬虫通常会在超时后放弃,所以把关键指标压到合理范围内是基础保障。

5. 代码层面的进阶操作:从被动等待到主动引导

5.1 用HTTP响应头告诉AI爬虫“这里有什么”

除了robots.txt和llms.txt,HTTP响应头也是一个可以主动传递信息的渠道。你可以在响应头里加入Link字段,指向你的llms.txt、sitemap和结构化数据,帮助爬虫更快发现关键资源。

在Nginx里可以这样配置:

add_header Link '<https://yourdomain.com/llms.txt>; rel="llms"'; add_header Link '<https://yourdomain.com/sitemap.xml>; rel="sitemap"'; add_header X-Robots-Tag "index, follow, max-snippet:-1, max-image-preview:large";

X-Robots-Tag这个头很重要,它相当于HTTP层面的robots meta标签。max-snippet:-1表示不限制摘要长度,max-image-preview:large表示允许大图预览。这两个设置对AI搜索引用有直接影响,因为AI搜索在生成回答时可能需要提取较长的摘要和图片。

注意:Link头的rel="llms"目前还不是标准,但部分AI爬虫已经开始识别。即使不被识别,也不会有负面影响,属于低成本尝试。

5.2 动态渲染的检测与降级方案

如果你的网站必须用客户端渲染,但又想让AI爬虫抓到内容,可以做一个动态检测和降级方案。核心思路是:在页面加载时检测User-Agent,如果是AI爬虫,就返回一个静态的、包含核心内容的HTML版本;如果是普通用户,就走正常的客户端渲染流程。

下面是一个基于Node.js和Express的简化示例:

const express = require('express'); const app = express(); const AI_BOTS = /GPTBot|ClaudeBot|PerplexityBot|Google-Extended/i; app.get('*', async (req, res) => { if (AI_BOTS.test(req.headers['user-agent'])) { const staticContent = await renderStaticPage(req.path); res.send(staticContent); } else { res.sendFile('index.html'); } }); async function renderStaticPage(path) { // 从数据库或缓存中获取页面内容,拼接成完整HTML const content = await getContentByPath(path); return `<!DOCTYPE html> <html> <head><title>${content.title}</title></head> <body> <article> <h1>${content.title}</h1> ${content.body} </article> </body> </html>`; }

这个方案的优点是改造成本低,不需要重构整个前端。缺点是维护两套渲染逻辑,需要确保静态版本和动态版本内容一致。实测下来,对于内容型网站,这个方案的投入产出比很高。

5.3 监控AI搜索引用的自动化脚本

做完上面这些配置之后,你需要一个持续监控的机制,看看AI搜索到底有没有引用你。手动去各个AI搜索里问问题效率太低,可以写一个简单的脚本,定期查询并记录结果。

下面是一个Python示例,用来自动化检查某个关键词下你的网站是否被引用:

import requests import json from datetime import datetime def check_ai_citation(query, your_domain): # 这里以某个AI搜索API为例,实际使用时替换为可用的接口 response = requests.post( "https://api.example-ai-search.com/search", json={"query": query}, headers={"Authorization": "Bearer YOUR_API_KEY"} ) data = response.json() citations = data.get("citations", []) cited = any(your_domain in c.get("url", "") for c in citations) return { "query": query, "cited": cited, "citation_count": len(citations), "timestamp": datetime.now().isoformat() } queries = [ "GEO优化怎么做", "AI搜索引用优化", "llms.txt怎么写" ] for q in queries: result = check_ai_citation(q, "yourdomain.com") print(json.dumps(result, ensure_ascii=False))

这个脚本可以每天跑一次,把结果存到数据库或日志里。跑一段时间后,你就能看到趋势:哪些关键词下你的网站开始被引用了,哪些还没有。对于还没被引用的关键词,回去检查对应页面的爬虫抓取、结构化数据和内容结构,针对性优化。

6. 几个我踩过的坑和实测有效的技巧

第一个坑是robots.txt的缓存问题。改完robots.txt之后,AI爬虫不会立刻重新读取,可能需要几天甚至几周。我试过在robots.txt里加版本号(比如# v2)来强制刷新,但效果不稳定。更可靠的做法是同时提交sitemap,通过sitemap的更新来触发爬虫重新访问。

第二个坑是结构化数据的类型选择。我一开始给所有页面都加了Article类型,后来发现AI搜索对TechArticle和HowTo的引用率明显更高。原因是这两个类型更具体,大模型能更准确地判断内容用途。所以不要图省事用通用类型,选最贴合的那个。

第三个坑是llms.txt的编码问题。这个文件必须用UTF-8编码,如果服务器默认用GBK或其他编码,大模型读取时会出现乱码,导致整个文件被忽略。检查方法是file -i llms.txt,确认返回charset=utf-8。

实测有效的技巧方面,有一个是“在文章开头200字内直接给出核心答案”。AI搜索在提取摘要时,会优先看页面开头部分。如果你把最重要的结论放在最前面,被引用的概率会明显提升。另一个是“用表格对比关键信息”,大模型对表格的解析能力很强,表格里的内容很容易被直接引用到回答里。

最后一个建议:不要只盯着一个AI搜索平台。不同的AI搜索爬虫行为差异很大,有的抓取频率高但引用门槛也高,有的抓取慢但一旦抓到就很容易引用。多平台同时优化,整体引用率才会稳定上升。我自己的站点在做了上述配置之后,大约过了三周开始看到AI搜索的引用流量,六周后稳定在每天几十次引用。这个周期供你参考,具体时间取决于你网站的更新频率和内容质量。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询