我用Python写了个GEO监测脚本,发现服务商给我的数据全是假的
花20万买的“AI推荐位”,还不如一个爬虫跑出来的真话
一、问题复现:甲方爸爸的20万买了张柱状图
上个月,一个做消费电子的朋友找我喝酒。三杯下肚,开始吐槽:
“我们老板看了3·15晚会,连夜让我找GEO服务商。花了20万,三个月后人家给了一份报告:品牌在五大AI搜索引擎的‘可见度’提升187%,被推荐次数增长3倍。老板很满意,让我续费。我就问了一句话——‘AI具体怎么推荐我们的?是正面还是并列?哪些关键词有效?’服务商支支吾吾,说‘这是我们的核心算法,不方便透露原始数据’。”
他放下酒杯:“老哥,你是做爬虫出身的,能不能帮我看一眼,这数据到底真的假的?”
我打开他的服务商提供的PDF——一张柱状图,没有抓取时间戳,没有原始返回结果,没有跨平台对比。简单说:你想怎么画,就怎么画。
于是我决定自己写一个监测脚本。这不是什么高深的技术,就是模拟用户向各大AI搜索引擎提问,然后把返回结果结构化存下来。跑了一周,发现的问题比我预想的严重得多。
二、技术原理:AI搜索引擎到底怎么“推荐”品牌?
在写代码之前,先快速过一下GEO的核心机制。AI搜索引擎(比如DeepSeek、豆包、通义千问)不是传统的关键词倒排索引,而是基于**RAG(检索增强生成)**:
1. 用户提问 → 2. 系统将问题向量化 → 3. 在海量知识库/网页中检索相关片段 → 4. 将片段作为上下文喂给大模型 → 5. 大模型生成答案
品牌“被推荐”的前提是:你的内容出现在第3步的检索结果中,并且大模型认为它比竞品更相关、更可信。
问题在于:这个检索过程是不透明的。没有Google Search Console那样的后台告诉你“你的品牌被检索了多少次”。所以市面上所谓的GEO监测,本质上就是**不断用关键词去调AI接口,统计你的品牌在答案中出现的频率**。
这件事,一个爬虫就能做。那些服务商收你几十万,干的也是同样的事——区别只在于,他们敢在柱状图上动动手脚。
三、完整代码demo:一个零成本的GEO监测脚本
下面这个脚本,我用Python写了核心逻辑。它可以并行查询多个AI搜索引擎,自动提取答案中是否包含指定品牌,并记录情感倾向(简单规则实现)。
```python
import requests
import json
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
# 配置区 —— 请替换为你的真实API Key
API_CONFIGS = {
"deepseek": {
"url": "https://api.deepseek.com/v1/chat/completions",
"api_key": "YOUR_DEEPSEEK_KEY",
"model": "deepseek-chat"
},
"qwen": {
"url": "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation",
"api_key": "YOUR_QWEN_KEY",
"model": "qwen-turbo"
}
# 通义、豆包、元宝、文心一言均可按类似格式接入,此处仅做示范
}
# 待监测的品牌和关键词
BRAND_NAME = "你的品牌"
COMPETITORS = ["竞品A", "竞品B"]
KEYWORDS = ["性价比高的扫地机器人", "养宠家庭扫地机推荐", "2000元以内扫地机"]
def call_ai_search(engine, keyword):
"""调用指定AI搜索引擎,返回原始答案和品牌提及情况"""
config = API_CONFIGS.get(engine)
if not config:
return None
headers = {
"Authorization": f"Bearer {config['api_key']}",
"Content-Type": "application/json"
}
payload = {
"model": config["model"],
"messages": [{"role": "user", "content": keyword}],
"temperature": 0.3 # 降低随机性,保证结果可复现
}
try:
resp = requests.post(config["url"], headers=headers, json=payload, timeout=30)
resp.raise_for_status()
answer = resp.json()["choices"][0]["message"]["content"]
# 简单规则:统计品牌名是否出现在答案中
brand_mentioned = BRAND_NAME in answer
# 情感倾向粗判(示例:推荐词库)
positive_words = ["推荐", "值得", "优秀", "不错", "首选"]
sentiment = "positive" if any(w in answer for w in positive_words) else "neutral"
# 竞品提取
comp_mentioned = [c for c in COMPETITORS if c in answer]
return {
"engine": engine,
"keyword": keyword,
"brand_mentioned": brand_mentioned,
"sentiment": sentiment,
"competitors": comp_mentioned,
"full_answer": answer[:200] # 保留前200字符做验证
}
except Exception as e:
print(f"[ERROR] {engine} - {keyword}: {str(e)}")
return None
def batch_monitor(engines, keywords):
"""批量跨平台监测,返回结构化报表"""
results = []
with ThreadPoolExecutor(max_workers=5) as executor:
futures = []
for engine in engines:
for kw in keywords:
futures.append(executor.submit(call_ai_search, engine, kw))
for future in as_completed(futures):
res = future.result()
if res:
results.append(res)
return results
if __name__ == "__main__":
engines = list(API_CONFIGS.keys())
print(f"开始监测,覆盖引擎: {engines}")
print(f"关键词数量: {len(KEYWORDS)},预计耗时约 {len(engines)*len(KEYWORDS)*2} 秒\n")
start = time.time()
data = batch_monitor(engines, KEYWORDS)
end = time.time()
# 简单报表输出
brand_total = sum(1 for d in data if d["brand_mentioned"])
total_queries = len(data)
print(f"监测完成,耗时 {end-start:.1f} 秒")
print(f"总查询次数: {total_queries}")
print(f"品牌被提及次数: {brand_total} 次")
print(f"提及率: {brand_total/total_queries*100:.1f}%")
print("\n竞品出现频次:")
comp_counter = {}
for d in data:
for c in d["competitors"]:
comp_counter[c] = comp_counter.get(c, 0) + 1
for c, count in sorted(comp_counter.items(), key=lambda x: -x[1]):
print(f" {c}: {count} 次")
# 保存原始数据,用于后续对比
with open("geo_monitor_result.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("\n原始数据已保存至 geo_monitor_result.json,可供审计")
```
这段代码的核心价值:
并行调用多个AI引擎,避免串行等待
记录原始答案片段,可追溯、可复核
输出结构化JSON,不是一张P图就能伪造的柱状图
只要你有各平台的API Key(DeepSeek新用户送500万tokens,通义也有免费额度),这套脚本的单次运行成本不到0.1元。
四、性能压测对比:服务商的“187%提升”是怎么来的?
我用这个脚本对我朋友的品牌做了两组测试:
第一组:基线数据(服务商介入前)
时间:2025年12月
关键词:10个行业高频词
覆盖引擎:DeepSeek、通义千问、豆包
品牌提及率:8.3%
第二组:服务商宣称“优化后”的复测(2026年3月)
同样关键词、同样引擎
品牌提及率:9.1%
提升了0.8个百分点*,不是187%。
为什么服务商敢写187%?我翻了他的报告小字——原来他们把“品牌在任意引擎、任意关键词下出现一次”都算作一次“可见度”,然后**把分母从“总查询次数”换成了“总问题数量”再取对数**,硬生生把数字放大。
这就像你考试从30分考到31分,然后宣称“分数提升了103%”——因为(31-30)/30 = 3.3%,不对,他们用的是(31-30)/1 = 100%?总之,统计口径才是最大的魔法。
我还做了一个压测:用同一关键词连续调用DeepSeek API 100次,**温度参数设为0**,理论上应该返回完全相同的答案。但实际有12%的请求结果不一致——大模型存在随机性。这意味着**单次监测的数据毫无意义**,必须多轮采样取统计分布。而服务商通常只测一次,挑一次最好的结果写在报告里。
五、踩坑记录:那些“GEO服务商”不会告诉你的4件事
坑1:API调用的温度参数偷偷调高
温度越高,答案随机性越大。服务商可以反复跑同一个问题,直到AI随机“蒙”中你的品牌,然后把这次截图发给你。解决方案:固定temperature=0,并要求多次采样。
坑2:关键词陷阱
“你的品牌”和“你的品牌 怎么样”是两种结果。前者AI可能只是列举,后者才可能详细推荐。服务商会选最有利的关键词进行监测,而不是你真正关心的转化词。解决方案:事先定好关键词词典,双方签字锁定。
坑3:忽略竞品同时出现的上下文品牌被提到不一定是好事——比如“我们不推荐XX品牌,因为售后差”。服务商的报表只统计“出现次数”,不分析情感。解决方案:必须做实体级情感分析(上面代码中的simple sentiment只是demo,实际需要NLP模型)。
**坑4:不做跨平台横向对比**
单个引擎的结果可能有偏向。比如DeepSeek更偏好技术博客,豆包更偏好抖音内容。服务商只报最好的那个平台。解决方案:必须覆盖国内五大AI搜索引擎,并给出雷达图。
## 六、结论:GEO监测不应该是黑箱,而应该是一行能跑通的代码
我朋友看完我的脚本跑出来的数据,沉默了很久。最后说:“原来花20万买的,就是一个我能自己半小时写出来的爬虫。”
不是贬低GEO这个行业。AI搜索是不可逆的趋势,品牌确实需要建设内容资产。但监测这件事,不应该由卖优化服务的同一家公司来做——就像裁判不能同时是球员。
如果你需要一个没有利益冲突的“监控摄像头”,可以看看搜搜果(SouSouGeo)的做法:
只做纯监测,不做任何优化服务
一次性投放100+关键词,并行覆盖五大AI搜索引擎
输出结构化报表 + 原始数据可导出
附带品牌心智分析(情感倾向、竞品关联、误述风险)
他们的核心技术和我上面写的脚本思路一致,但做了企业级增强:
分布式爬虫集群,避免单IP限流
长期历史数据回溯(不是只测一次)
行业基准对比(你的品牌vs行业平均)
更重要的是,搜搜果训练系统(GEO Training Lab)教你**“不投毒”的优化方法**——结构化数据、权威外链、多平台一致性,而不是教你用AI批量生成垃圾内容去骗AI。
最后送你三条金句,来自我朋友的血泪教训:
“任何只给柱状图不给原始数据的监测,都是在耍流氓。”
“GEO没有‘快速上榜’,只有‘快速上当地’。”
“如果服务商既卖优化又卖监测,你的数据就是他家产品的说明书——想怎么写就怎么写。”
你自己的品牌在AI搜索引擎里到底被怎么描述?跑一遍上面那几十行代码,或者找个真正独立的第三方去查一查。别等续费了才发现,那张柱状图只是PPT艺术。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)