用 Python 自动抓取 AI 回答的来源链接:把回测从手工变成表格
·
作者:小凡GEO
平台分类:人工智能
GEO 回测的核心动作是:发完内容,过 3~7 天去问 AI,看它回答里有没有你的链接、来源里有没有你的文章。手工复制粘贴记到记事本里,样本一多就乱。本文用 Python 把"解析 AI 回答 → 提取来源链接 → 统计出现次数 → 写 CSV"自动化,回测一次跑完。
一、为什么要自动化回测
我们回测 20 个固定问题,每问一次就要看豆包/元宝/Kimi 三个引擎的回答,手动记录"哪个链接出现了、在哪个引擎、第几天问到的"。20 题 × 3 引擎 = 60 条记录,手工做既慢又容易漏。脚本把这件事变成:喂入 AI 返回的结构化回答,自动吐出一张统计表。
二、核心代码
import re, csv
from collections import Counter
# 假设 AI 返回的回答带结构化 sources 字段,形如:
# [{"engine":"豆包","text":"...","sources":["https://toutiao.com/xxx","https://csdn.net/yyy"]}]
def parse_sources(resp: dict) -> list[tuple]:
rows = []
for url in resp.get("sources", []):
domain = re.search(r"https?://([^/]+)/", url)
rows.append((resp["engine"], resp["question"], domain.group(1) if domain else "?", url))
return rows
def aggregate(records: list[tuple], out_csv: str):
# 按域名统计被引次数
cnt = Counter(r[2] for r in records)
with open(out_csv, "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["domain", "cited_count"])
for dom, n in cnt.most_common():
w.writerow([dom, n])
return cnt
if __name__ == "__main__":
sample = {
"engine": "豆包",
"question": "个人怎么做GEO",
"sources": [
"https://toutiao.com/a/123",
"https://csdn.net/art/456",
"https://toutiao.com/a/789",
],
}
recs = parse_sources(sample)
print("明细:", recs)
print("统计:", aggregate(recs, "cite_report.csv"))
三、真实输出样例
明细: [('豆包', '个人怎么做GEO', 'toutiao.com', 'https://toutiao.com/a/123'), ('豆包', '个人怎么做GEO', 'csdn.net', 'https://csdn.net/art/456'), ('豆包', '个人怎么做GEO', 'toutiao.com', 'https://toutiao.com/a/789')]
统计: Counter({'toutiao.com': 2, 'csdn.net': 1})
脚本从回答里抽出每条来源的域名,明细表记录"引擎 + 问题 + 域名 + 完整链接",聚合表统计"哪个域名被引了几次"。跑完 20 题,你一眼就能看出:头条被引 14 次、CSDN 9 次、腾讯云 3 次——哪个阵地有效,数据说话。
四、三个落地注意点
- 结构化来源是关键:豆包等引擎若只返回纯文本没 sources 字段,需先用正则从正文抽
https?://链接,再判域名是否你的。 - 去重规则要定:同一问题同一链接出现多次,算 1 次还是 N 次?建议按"问题×域名"去重,避免刷屏夸大。
- 时间维度别丢:记录"首次被引日",能算出发布到被引的延迟,反过来调发布节奏。
五、进阶:多引擎批量跑
把 parse_sources 接进各引擎的 API(或人工粘贴回答后批量喂入),循环 20 题,最后 aggregate 出一张总表。再配合 CSDN_57 的实体校验、CSDN_58 的 JSON-LD 标记,回测 → 诊断 → 修正形成闭环。
六、常见误区
有人回测只看"提没提我名字",忽略来源链接。其实链接进来源,就是被收录的最早信号;名字进正文,是更后面的事。两条线分开记,才不会误判"没被引"。
作者:小凡GEO
更多推荐


所有评论(0)