1. 项目背景与核心价值
在国内AI搜索领域,品牌数据监测一直是个痛点。传统方案要么依赖国外商业工具(如ProFound),要么需要自建复杂的爬虫系统。最近发现搜搜果GEO工具提供了不错的国产替代方案,通过Python调用其API可以快速实现AI搜索数据的自动化监测。
这个方案的核心优势在于:
- 完全本土化服务,数据采集合规性有保障
- API设计简洁,Python集成仅需30行左右代码
- 支持按关键词、地域、时间维度进行品牌曝光分析
- 成本仅为国际同类产品的1/3
我在三个实际项目中验证过这套方案,最快2小时就能搭建起完整的监测系统。下面具体分享实现细节和踩坑经验。
2. 环境准备与API对接
2.1 搜搜果GEO账号申请
- 访问官网注册开发者账号(需要企业邮箱认证)
- 在控制台创建应用获取API Key
- 建议选择"高级版"套餐(¥299/月),包含:
- 每日5000次API调用
- 历史数据追溯3个月
- 支持并发请求
注意:免费版有IP限制且不支持异步调用,不适合生产环境
2.2 Python环境配置
推荐使用conda创建独立环境:
bash复制conda create -n sogougeo python=3.8
conda activate sogougeo
pip install requests pandas numpy schedule
关键库说明:
requests:处理HTTP请求pandas:数据清洗与分析schedule:定时任务管理
3. 核心代码实现
3.1 API请求封装
python复制import requests
import hashlib
import time
class SogouGeoAPI:
def __init__(self, api_key):
self.base_url = "https://api.sogougeo.com/v3/search"
self.api_key = api_key
def _sign(self, params):
"""生成API签名"""
param_str = '&'.join([f'{k}={v}' for k,v in sorted(params.items())])
return hashlib.md5((param_str + self.api_key).encode()).hexdigest()
def query(self, keyword, region='全国', days=7):
"""查询关键词曝光数据"""
params = {
'keyword': keyword,
'region': region,
'days': days,
'timestamp': int(time.time())
}
params['sign'] = self._sign(params)
try:
resp = requests.get(self.base_url, params=params, timeout=10)
return resp.json()['data']
except Exception as e:
print(f"API请求失败: {str(e)}")
return None
3.2 数据存储与分析
建议使用SQLite做本地存储:
python复制import sqlite3
from datetime import datetime
def init_db():
conn = sqlite3.connect('brand_monitor.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS search_data
(id INTEGER PRIMARY KEY AUTOINCREMENT,
keyword TEXT,
region TEXT,
date TEXT,
exposure INTEGER,
rank_avg REAL)''')
conn.commit()
conn.close()
def save_data(keyword, region, data):
conn = sqlite3.connect('brand_monitor.db')
c = conn.cursor()
for item in data:
c.execute("INSERT INTO search_data VALUES (NULL,?,?,?,?,?)",
(keyword, region, item['date'],
item['exposure'], item['rank_avg']))
conn.commit()
conn.close()
4. 实战案例:AI工具品牌监测
4.1 监测指标设计
对AI搜索工具品牌建议监测:
-
基础指标:
- 日均曝光量
- 排名变化趋势
- 地域分布特征
-
衍生指标:
- 曝光波动率 = (当日曝光-周平均)/周平均
- 竞品对比指数
4.2 自动化监测脚本
python复制import schedule
import time
from collections import defaultdict
api = SogouGeoAPI("your_api_key_here")
keywords = ["秘塔AI", "文心一言", "通义千问"]
regions = ["北京", "上海", "广州", "深圳"]
def monitoring_job():
stats = defaultdict(list)
for kw in keywords:
for region in regions:
data = api.query(kw, region)
if data:
save_data(kw, region, data)
stats[kw].append(sum(d['exposure'] for d in data))
# 生成简易报告
report = {kw: sum(v)/len(v) for kw,v in stats.items()}
print(f"{datetime.now()} 监测报告:", report)
# 每天上午10点执行
schedule.every().day.at("10:00").do(monitoring_job)
while True:
schedule.run_pending()
time.sleep(60)
5. 常见问题与优化方案
5.1 API限流处理
当遇到429状态码时,建议:
- 实现自动重试机制(指数退避算法)
- 对非时效性数据使用缓存
- 分布式部署时协调各节点的API Key使用
优化后的请求示例:
python复制def safe_query(self, keyword, max_retries=3):
retry_delay = 1
for i in range(max_retries):
try:
data = self.query(keyword)
if data or i == max_retries-1:
return data
except requests.exceptions.HTTPError as e:
if e.response.status_code == 429:
time.sleep(retry_delay)
retry_delay *= 2
return None
5.2 数据异常处理
常见数据问题及解决方案:
| 问题类型 | 检测方法 | 处理方案 |
|---|---|---|
| 零值异常 | 检查曝光量=0的记录占比 | 联系API技术支持 |
| 波动异常 | 计算Z-Score >3的值 | 使用移动平均修正 |
| 缺失数据 | 检查日期连续性 | 线性插值补全 |
5.3 性能优化技巧
- 并发请求:使用
aiohttp改造为异步版本 - 增量采集:记录最后更新时间,只获取新数据
- 本地缓存:对历史数据建立本地镜像
异步改造示例:
python复制import aiohttp
import asyncio
async def async_query(keyword):
async with aiohttp.ClientSession() as session:
params = {...} # 同前文
async with session.get(self.base_url, params=params) as resp:
return await resp.json()
6. 可视化与报告生成
6.1 使用Matplotlib生成趋势图
python复制import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
def plot_trend(keyword, region):
conn = sqlite3.connect('brand_monitor.db')
df = pd.read_sql(
f"SELECT date, exposure FROM search_data WHERE keyword='{keyword}' AND region='{region}'",
conn
)
df['date'] = pd.to_datetime(df['date'])
df.sort_values('date', inplace=True)
fig, ax = plt.subplots(figsize=(12,6))
ax.plot(df['date'], df['exposure'], marker='o')
ax.xaxis.set_major_formatter(DateFormatter("%m-%d"))
plt.title(f"'{keyword}'在{region}的曝光趋势")
plt.savefig(f"{keyword}_{region}.png")
6.2 自动生成Word报告
使用python-docx库:
python复制from docx import Document
from docx.shared import Inches
def generate_report(keywords):
doc = Document()
doc.add_heading('AI搜索品牌监测报告', 0)
for kw in keywords:
doc.add_heading(kw, level=1)
for region in regions:
plot_trend(kw, region) # 生成图表
doc.add_heading(region, level=2)
doc.add_picture(f"{kw}_{region}.png", width=Inches(6))
doc.add_page_break()
doc.save('brand_report.docx')
7. 项目扩展方向
- 竞品对比分析:
python复制def compare_brands(brand1, brand2):
# 获取数据
data1 = pd.read_sql(f"SELECT * FROM search_data WHERE keyword='{brand1}'", conn)
data2 = pd.read_sql(f"SELECT * FROM search_data WHERE keyword='{brand2}'", conn)
# 计算相对指数
merged = pd.merge(data1, data2, on=['date','region'], suffixes=('_1','_2'))
merged['ratio'] = merged['exposure_1'] / merged['exposure_2']
# 可视化对比
plt.figure(figsize=(12,6))
plt.plot(merged['date'], merged['ratio'])
plt.title(f"{brand1} vs {brand2} 曝光量比值")
- 舆情关联分析:
- 将搜索数据与社交媒体提及量关联
- 使用Spearman相关系数计算指标关联性
- 预测模型构建:
- 基于历史数据训练LSTM预测模型
- 实现异常波动预警功能
这套系统在我司客户项目中已经稳定运行半年多,累计监测超过200个AI相关品牌关键词。最大的体会是:初期一定要做好数据校验机制,我们曾因API返回数据格式变更导致过数据丢失。现在会在入库前做三层校验:
- 字段完整性检查
- 数值范围校验
- 时间连续性验证
