AI大模型市场分析:从各家API定价页提取结构化对比
做 AI 大模型市场分析时,最容易踩的坑是直接引用第三方榜单或二手价格表。
各家定价页更新频繁,二手数据往往滞后。
更可靠的做法是用脚本定期抓取官方定价页,清洗成结构化 CSV,再按统一口径对比。
本文用 Python 的 requests 和 BeautifulSoup 完成一次抓取,适合有基础 Linux 和 Python 环境的读者。
先确认目标页面和抓取边界
开始前要明确两件事:抓哪些页面、抓哪些字段。
以常见厂商的 API 定价页为例,通常需要提取模型名称、输入单价、输出单价、计价单位(每千 token 或每百万 token)。
不同厂商页面结构差异很大,不能指望一个选择器通吃。
准备条件:
- 一台能访问外网的 Linux 服务器,已安装 Python 3.8 及以上版本
- 安装依赖:
pip install requests beautifulsoup4 lxml - 目标定价页的 URL 列表,建议先手动打开确认页面能正常渲染
建议先从一两家结构稳定的页面开始,跑通流程再扩展。
不要一上来就抓十几家,否则解析规则会失控。
编写抓取与清洗脚本
下面脚本以通用表格结构为例,把页面中的表格行转换成字典列表。
实际使用时需要根据目标页面的 HTML 调整 table 选择器和列索引。
import csv
import requests
from bs4 import BeautifulSoup
URLS = {
"vendor_a": "https://example.com/pricing",
}
headers = {
"User-Agent": "Mozilla/5.0 (compatible; MarketResearch/1.0)"
}
rows = []
for vendor, url in URLS.items():
resp = requests.get(url, headers=headers, timeout=15)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "lxml")
table = soup.find("table")
if table is None:
print(f"{vendor}: 未找到表格,检查页面结构")
continue
for tr in table.find_all("tr")[1:]:
cols = [td.get_text(strip=True) for td in tr.find_all(["td", "th"])]
if len(cols) < 3:
continue
rows.append({
"vendor": vendor,
"model": cols[0],
"input_price": cols[1],
"output_price": cols[2],
})
with open("pricing.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["vendor", "model", "input_price", "output_price"])
writer.writeheader()
writer.writerows(rows)
print(f"共写入 {len(rows)} 条记录")
运行 python3 fetch_pricing.py 后,检查当前目录是否生成 pricing.csv,用 head pricing.csv 查看前几行是否符合预期。
如果输出为空,优先检查 soup.find("table") 是否命中,以及页面是否由 JavaScript 动态渲染。
统一计价口径再对比
抓下来的原始数据往往单位不一致,有的写“每千 token 0.002 美元”,有的写“每百万 token 2 美元”。
直接对比会得出错误结论。
建议在清洗阶段增加一列统一单价,例如全部换算成“每百万 token 美元价”。
可以用一个简单的转换函数处理常见单位:
def to_per_million(text):
text = text.lower().replace("$", "").strip()
if "百万" in text or "million" in text:
return text
if "千" in text or "1k" in text:
num = float(text.split()[0])
return str(num * 1000)
return text
实际使用时要把文本解析得更健壮,比如用正则提取数字和单位。
转换后建议人工抽查几条记录,确认没有把“每千字符”误当成“每千 token”。
避坑与结果验证
页面结构变化是这类脚本最常见的失败原因。
厂商改版后表格选择器可能失效,表现为抓取结果为空或字段错位。
建议每次运行后检查记录数量,并与上次结果对比,数量骤降时先人工打开页面确认。
反爬与频率也要注意。
不要高频请求同一域名,设置合理的 timeout,必要时在请求之间加 time.sleep(2)。
如果返回 403,先检查 User-Agent 和是否触发了访问频率限制,不要直接加大并发。
动态渲染页面用 requests 抓不到真实表格。
如果页面源码里没有 table 标签,需要改用浏览器开发者工具确认接口,或使用 Playwright 等工具渲染后再解析。
验证方式:
- 用
wc -l pricing.csv确认行数,与页面可见模型数量大致一致 - 随机抽取 2 到 3 个模型,手动对照页面价格
- 把 CSV 导入表格软件,按单价排序,检查是否有明显异常值
完成以上步骤后,你得到的是可复核的原始价格数据。
后续做 AI大模型市场分析时,建议保留每次抓取的时间和原始 CSV,方便对比价格变化,而不是只记住一个静态结论。