finance-data-crawler v2.1.0 — 财经类大学生数据爬虫
十三大金融数据源统一采集 | 三阶段管道(索引→全文→文档) | 断点续传 + 软拦截检测 | 财务指标抽取 + 杜邦分解 | 对接 bizcomp-lab 商赛分析 + acct-research-kit 实证研究
⚡ 一键上手
直接对话即可触发,无需记忆命令:
帮我找茅台的年报数据
爬一下东方财富近一周关于 AI 板块的研报
我要做 PwC 杯的行业研究,需要珀莱雅和贝泰妮的财务对比
帮我收集 CPA 经济法最新的增值税法规
下载茅台、格力、平安近 3 年的 10-K(美股)/年报(A 股)
一键 CLI(用托管 Python,无需配环境):
PY="C:/Users/36118/.workbuddy/binaries/python/envs/default/Scripts/python.exe"
$PY scripts/finance_data_crawler.py list # 列出所有数据源
$PY scripts/finance_data_crawler.py info cninfo # 查看巨潮的能力与配额
$PY scripts/finance_data_crawler.py all eastmoney --days 7 --format excel # 东财 7 天全流程
🧭 场景速查(想做什么 → 直接入口)
无需记忆命令,按"想做什么"找到入口。完整 CLI 见 references/05-cli-reference.md。
| 你想做什么 | 推荐数据源 | CLI 命令 |
|---|---|---|
| 下载某 A 股公司年报/公告 PDF | 巨潮 | all cninfo --ticker 600519 --format excel |
| 下载美股 10-K/10-Q | SEC EDGAR | all sec_edgar --ticker AAPL --format excel |
| 抓 GDP/CPI/人口/就业宏观数据 | 国家统计局 | all stats --indicator cpi --years 3 |
| 爬东财研报/公告/龙虎榜 | 东方财富 | all eastmoney --days 7 --format excel |
| 爬雪球社区舆情/大 V 观点 | 雪球 | all xueqiu --keyword 茅台 --days 3 |
| 下载 MBB/精品咨询白皮书 | MBB 官网 | all consulting --firm mckinsey --format md |
| 下载艾瑞/亿欧/头豹研报 | 国内智库 | all research_report --topic AI --format excel |
| 抓沪深北交易所公告/披露规则 | 交易所 | all exchange --market szse --days 30 |
| 抓 Tushare 行情/宏观/基金数据 | Tushare Pro | all tushare --api stock_basic |
| 查信用/失信/处罚/红黑名单 | 信用中国 | all credit_china |
| 抓海关进出口月报 | 海关总署 | all customs --years 3 |
| 抓 IMF/世行/OECD 国际数据 | 国际组织 | all international_orgs --org imf |
| 财务指标横评(毛利率/ROE/净利率) | 跨源 | consume financial_metrics --tickers 600519,000651 |
| 杜邦三因子分解对比 | 跨源 | consume duPont --tickers 600519,000651 --years 3 |
| 商赛竞品对比表(自建) | 跨源 | consume competitor_table --industry 化妆品 |
📚 资源清单(找什么去哪里)
| 找什么 | 去哪里 | |---|---| | 数据源清单 + 分级 + 反爬难度 | references/00-info-sources-mapping.md | | 反爬策略(软拦截/限流/降级/登录墙) | references/01-anti-scraping-strategy.md | | 统一输出 schema(字段定义) | references/02-data-schema.md | | 与 bizcomp-lab 对接说明 | references/03-bizcomp-pipeline.md | | 场景→数据源智能推荐 | references/04-scene-mapper.md | | 完整 CLI 速查 | references/05-cli-reference.md | | 故障排查(空/限流/登录墙/解析失败) | references/06-troubleshooting.md | | 已注册数据源(机器可读) | data/sources.json | | Adapter 矩阵(覆盖范围) | data/adapter_matrix.csv | | 用户配置模板(Cookie/Token) | data/config_example.json |
🗺️ 路由:关键词 → 模块映射
| 用户关键词 | 触发模块 | CLI 示例 |
|---|---|---|
| 年报/财报/公告/招股书 | cninfo_adapter | index cninfo --ticker 600519 |
| 10-K/10-Q/美股年报 | sec_edgar_adapter | index sec_edgar --ticker AAPL |
| GDP/CPI/人口/就业/工业 | stats_adapter | index stats --indicator gdp |
| 研报/龙虎榜/北向资金/板块 | eastmoney_adapter | index eastmoney --days 7 |
| 舆情/大 V/讨论/股吧 | xueqiu_adapter | index xueqiu --keyword 茅台 |
| 麦肯锡/BCG/贝恩/白皮书 | consulting_adapter | index consulting --firm mckinsey |
| 艾瑞/亿欧/头豹/36 氪 | research_report_adapter | index research_report --topic AI |
| 交易所公告/披露/规则 | exchange_adapter | index exchange --market szse |
| Tushare 行情/宏观/基金 | tushare_adapter | index tushare --api stock_basic |
| 信用中国/失信/处罚/红黑名单 | credit_china_adapter | index credit_china |
| 海关/进出口月报 | customs_adapter | index customs |
| IMF/世界银行/OECD/国际数据 | international_orgs_adapter | index international_orgs --org imf |
| 证监会处罚/行政许可/IPO预披露 | csrc_adapter | index csrc --column penalty |
| 创投/融资事件/赛道地图 | itjuzi_adapter | index itjuzi --keyword AI(⚠️登录墙,公开页有限) |
| 任意公开网页/新闻站正文 | web_scraper_adapter | index web_scraper --urls https://... |
| 单篇公众号文章(已授权) | gzh_adapter | index gzh --urls <授权文章链接>(⚠️合规受限) |
| 单篇知网文献元数据(授权环境) | academic_cnki_adapter | index academic_cnki --urls <授权文献链接>(⚠️合规受限) |
| Wind已授权数据转发 | wind_proxy_adapter | index wind_proxy --wind_code 600519.SH(⚠️需合法授权,不破解付费终端) |
| 杜邦/ROE 拆解/财务比率 | data_consumers.duPont | consume duPont --tickers 600519,000651 |
| 毛利率/净利率/费用率横评 | data_consumers.financial_metrics | consume financial_metrics --tickers 600519 |
| 竞品对比表/行业横评 | data_consumers.competitor_table | consume competitor_table --industry 化妆品 |
| 三表联动财务预测 | data_consumers.financial_forecast | consume financial_forecast --tickers 600519 --extra growth=0.1 |
| PEST 宏观环境分析 | data_consumers.PEST_analysis | consume PEST_analysis --industry 化妆品 |
| 供应链上下游地图 | data_consumers.supply_chain_map | consume supply_chain_map --industry 白酒 |
⚙️ 三阶段管道(必须分离,支持断点续传)
借鉴 news-site-batch-scraper 验证过的模式,每阶段可独立重跑。
Stage 1 — 建立索引(index)
目标:遍历数据源列表页,收集时间范围内的条目 URL + 元数据,输出 index.json。
- 探测页面结构。优先顺序:🥇 AJAX/API 接口(最快)→ 🥈 静态分页 → 🥉 逐条跳转
- 复现接口请求。从页面 JS 提取 data 参数;⚠️ 服务端签名校验时保持原参数不动
- 翻页采集。终止条件:连续 3 页全部早于目标范围才停(防置顶文章干扰)
- 跨栏目去重。用 URL 作唯一标识
- 保存索引。输出
data/runs/<adapter>/<timestamp>/index.json
Stage 2 — 并发全文抓取(fetch)
目标:读 index.json,并发抓取每条全文,追加到 articles.jsonl。
- 断点续传。启动时读
articles.jsonl已抓 URL,构建跳过集合 - 并发抓取。
ThreadPoolExecutor(max_workers=6),每请求间隔 0.1~0.2s - 软拦截检测。200 但内容是验证码页 → 自动切浏览器兜底;429/503 遵从
Retry-After - URL 去重。
UrlDeduplicator跨进程持久化(data/seen_urls.json) - 失败分类。
outlink(外链)/image_only(纯图片)/timeout(超时重试 1 次)/blocked(反爬标记) - 实时写入。每抓一条立即追加 jsonl,每 50 条 flush
Stage 3 — 文档生成(build)
目标:读 articles.jsonl,生成 Excel/Word/Markdown/CSV。
- 重新严格过滤日期。用文章页发布时间而非列表接口时间(两者可能不一致)
- 按时间排序。升序
- 文档开头添加统计。总数/时间跨度/来源分布/生成时间
- Word 中文字体。宋体,
style.element.rPr.rFonts.set(qn("w:eastAsia"), "宋体") - Excel 多 sheet。每数据源一个 sheet + 汇总 sheet
🛡️ 反爬与降级(Gotchas)
参考 cn-financial-scraper v7.2.0 的六级降级链,本 skill 简化为三级。
三级降级链
HTTP(requests) → 浏览器(Playwright headless) → 放弃(标记 blocked)
↓ ↓
快但易被封 慢但能过 JS 检测
| 级别 | 触发条件 | 实现 |
|---|---|---|
| L1 HTTP | 默认 | http_utils.http_get |
| L2 浏览器 | L1 返回 200 但内容是验证码页/空页/JS 渲染 | browser_fetch(需 Playwright) |
| L3 放弃 | L2 也失败 | 标记 blocked,写入 failed.json |
软拦截检测(200 反爬页)
# 不是所有 200 都是真的页面——有些是验证码/访问被拒的短页面
SOFT_BLOCK_SIGNATURES = [
"请输入验证码", "访问被拒", "请求过于频繁", "为了您的正常访问",
"captcha", "verify", "robot check", "access denied"
]
# 命中签名 → 自动切 L2 浏览器兜底
域名级限流(DomainRateLimiter)
每个域名独立限流,避免单域名被封拖垮全局:
| 域名 | 默认间隔 | 说明 | |---|---|---| | eastmoney.com | 0.5s | 较宽松 | | cninfo.com.cn | 1.0s | 官方站,保守 | | xueqiu.com | 1.5s | 反爬较严 | | stats.gov.cn | 1.0s | 政府站 | | sec.gov | 0.8s | 美国政府站 |
常见反爬陷阱
| 陷阱 | 症状 | 解决 |
|---|---|---|
| AJAX 必须带 X-Requested-With: XMLHttpRequest | 返回"非法参数" | 从页面 JS 复制完整 data 参数 |
| 服务端签名校验 | 改参数就 403 | 保持原参数不动 |
| 雪球需 Cookie | 返回登录页 | 用户在 config.json 填 Cookie |
| SEC EDGAR 限 User-Agent | 403 | 必须带 Sample Company sample@example.com |
| 统计局 SPA 动态渲染 | HTTP 抓到空 | 自动切 L2 浏览器 |
| 巨潮 PDF 下载 302 | 下载到 HTML | 跟随重定向 + 验证 Content-Type |
✅ 验证循环(数据质量校验)
这是 web-scraper/rupert 等竞品都没有的环节——本 skill 的核心差异化。
三维质量校验
# quality_checker.py 核心逻辑
def validate(data, source_name):
"""三维数据质量校验"""
# 1. 缺失检查
missing_ratio = count_missing(data) / len(data)
if missing_ratio > 0.3:
warns.append(f"{source_name} 缺失率 {missing_ratio:.0%},建议尝试备用数据源")
# 2. 交叉验证(同一指标在不同数据源是否一致)
if has_cross_source(field):
other_value = lookup(field, alternate_source)
if abs(value - other_value) / value > 0.05: # 5% 偏差
flags.append(f"{source_name}.{field} 与 {alt_source} 偏差>5%,请人工核对")
# 3. 异常值检测(Z-score >3 或业务常识边界)
outliers = detect_outliers(data, method="z_score")
# 业务边界:毛利率应在 [-20%, 95%],ROE 应在 [-50%, 80%]
biz_outliers = detect_biz_boundary(data)
if outliers or biz_outliers:
flags.append(f"检测到 {len(outliers)} 个疑似异常值,建议查阅原始公告")
return {"data": data, "warnings": warns, "flags": flags}
校验结果反馈给用户
校验完成后,输出不只有数据,还有:
✅ 巨潮资讯:抓取 23 条公告,0 异常
⚠️ 东方财富:抓取 45 条研报,2 条疑似异常值(毛利率 >95%),已标记
❌ 雪球:抓取 12 条讨论,3 条返回登录页(Cookie 过期),建议更新 config.json
📊 数据源分级(按学生使用场景)
| 优先级 | Adapter | 数据源 | 认证 | 预期成功率 | 难度 |
|---|---|---|---|---|---|
| ★★★ P0 | cninfo_adapter | 巨潮资讯 | ❌ 免费 | 85%+ | ⭐ |
| ★★★ P0 | stats_adapter | 国家统计局 | ❌ 免费 | 90%+ | ⭐⭐ |
| ★★★ P0 | eastmoney_adapter | 东方财富 | ❌ 免费 | 90%+ | ⭐ |
| ★★ P1 | xueqiu_adapter | 雪球 | ⚠️ Cookie | 80%+ | ⭐⭐ |
| ★★ P1 | consulting_adapter | MBB/精品咨询 | ❌ 免费 | 75%+ | ⭐⭐ |
| ★★ P1 | research_report_adapter | 艾瑞/亿欧/头豹 | ❌ 免费 | 80%+ | ⭐ |
| ★★ P1 | sec_edgar_adapter | SEC EDGAR | ❌ 免费 | 95%+ | ⭐ |
| ★★ P1 | exchange_adapter | 沪深北交易所 | ❌ 免费 | 90%+ | ⭐⭐ |
| ★★ P1 | tushare_adapter | Tushare Pro | ✅ Token | 95%+ | ⭐⭐ |
| ★★ P1 | credit_china_adapter | 信用中国 | ❌ 免费 | 85%+ | ⭐⭐ |
| ★★ P1 | customs_adapter | 海关总署 | ❌ 免费 | 80%+ | ⭐⭐ |
| ★★ P1 | international_orgs_adapter | IMF/世界银行/OECD | ❌ 免费 | 90%+ | ⭐⭐ |
| ★★ P1 | csrc_adapter | 证监会 | ❌ 免费 | 80%+ | ⭐⭐ |
| ⭐ P2 | web_scraper_adapter | 通用网页(兜底) | ❌ 免费 | 70%+ | ⭐ |
| ⭐ P3 | itjuzi_adapter | IT桔子(创投) | ⚠️ 登录墙 | 30-50% | ⭐⭐⭐ |
| ⭐ P3 | gzh_adapter | 微信公众号 | ⚠️ 需授权 | 60%+ | ⭐⭐⭐ |
| ⭐ P3 | academic_cnki_adapter | 知网 | ⚠️ 需机构授权 | 50%+ | ⭐⭐⭐ |
| ⭐ P3 | wind_proxy_adapter | Wind(授权转发) | ⚠️ 需合法授权 | 取决于本地 | ⭐⭐⭐ |
v2.1 已实现 18 个适配器(12 基础 + 6 补齐),覆盖 18 大数据源/渠道。P3 为受限/合规场景(反爬严或不保证成功率,gzh/cnki/wind 有合规边界,详见下文"合规红线")。
🔄 下游消费层(对接 bizcomp-lab + acct-research-kit)
爬完数据不是终点——本 skill 提供 7 个 data_consumer,把原始数据加工成商赛可直接用的格式。 同时作为 acct-research-kit(会计实证 DID 研究)的数据底座,为其提供年报/专利/宏观/公告原料。
| Consumer | 输入 | 输出 | 对接 bizcomp-lab 哪步 | 对接 acct-research-kit |
|---|---|---|---|---|
| financial_metrics_extractor | PDF/HTML 公告 | 财务比率表(毛利率/净利率/ROE/费用率) | Phase 2 步骤 3:自建横向对比表 | DID 因变量(绿色创新投入) |
| duPont_calculator | 财务比率表 | 杜邦三因子分解 + 横向对比 | Phase 2 步骤 4:自建杜邦分析模型 | 控制变量(ROE/杠杆/规模) |
| industry_competitor_table | 多公司财务数据 | 行业竞品对比 Excel | Phase 3:竞品分析 | 行业固定效应分组 |
| report_brief | 全部上述输出 | 商赛简报 Markdown | Phase 5:报告写作素材 | 文献综述素材汇总 |
| financial_forecast_model | 年报基准财务指标 | 三表联动预测 Excel(3 年营收/净利/资产) | 商业计划书财务预测 | 预测期对照组设定 |
| PEST_analysis | 已爬取宏观数据 | PEST 四维度分析 Markdown | Phase 1 宏观环境扫描 | 制度环境控制变量 |
| supply_chain_map | 行业名 + 核心公司 | 供应链上下游地图 Excel/MD | Phase 2 产业链梳理 | 上下游关联分析 |
调用:
$PY scripts/finance_data_crawler.py consume financial_metrics --tickers 600519,000651,603605
$PY scripts/finance_data_crawler.py consume duPont --tickers 600519,000651 --years 3
$PY scripts/finance_data_crawler.py consume competitor_table --industry 化妆品
$PY scripts/finance_data_crawler.py consume financial_forecast --tickers 600519 --extra growth=0.1
$PY scripts/finance_data_crawler.py consume PEST_analysis --industry 化妆品
$PY scripts/finance_data_crawler.py consume supply_chain_map --industry 白酒
$PY scripts/finance_data_crawler.py consume competitor_table --industry 化妆品
详见 references/03-bizcomp-pipeline.md。
🔧 环境准备
# 托管 Python(推荐,已预装大部分依赖)
PY="C:/Users/36118/.workbuddy/binaries/python/envs/default/Scripts/python.exe"
# 三层依赖(对齐 cn-financial-scraper 模式)
$PY scripts/setup_env.py # 核心:requests + bs4 + lxml + pandas(已预装)
$PY scripts/setup_env.py --recommended # + python-docx + openpyxl(Word/Excel 导出)
$PY scripts/setup_env.py --full # + playwright(动态页面/类人爬取)
| 功能 | 需要的依赖 | 安装命令 |
|---|---|---|
| HTTP 爬取 / 索引 / 质量校验 | requests, bs4, lxml, pandas | setup_env.py(默认) |
| Word/Excel 导出 | python-docx, openpyxl | setup_env.py --recommended |
| 动态页面(SPA/类人爬取) | playwright | setup_env.py --full |
📝 多轮示例
示例 1:下载茅台年报 + 财务指标横评
用户:帮我找茅台的年报数据,顺便跟格力、平安对比一下财务指标
AI:识别场景=财报分析,推荐 cninfo_adapter
① index cninfo --ticker 600519 --years 3 # 茅台 3 年年报索引
② fetch cninfo # 下载 PDF
③ consume financial_metrics --tickers 600519,000651,601318
→ 输出 Excel:毛利率/净利率/ROE/费用率横评表
④ consume duPont --tickers 600519,000651,601318 --years 3
→ 输出杜邦三因子分解对比
⑤ 质量校验:茅台毛利率 91% 正常;平安毛利率 100%(保险业特殊,标记提示)
示例 2:商赛行业研究(PwC 杯化妆品行业)
用户:我要做 PwC 杯的行业研究,需要珀莱雅和贝泰妮的财务对比
AI:识别场景=商赛竞品数据,多源组合
① index cninfo --ticker 603605 # 珀莱雅
② index cninfo --ticker 300957 # 贝泰妮
③ index sec_edgar --ticker EL # 雅诗兰黛(美股对标)
④ index eastmoney --days 30 --topic 化妆品 # 行业研报
⑤ fetch all # 全部下载
⑥ consume competitor_table --industry 化妆品
→ 输出 Excel:4 家公司 × 8 个指标 × 3 年趋势
⑦ consume report_brief --industry 化妆品
→ 输出 Markdown 商赛简报(含数据来源标注)
示例 3:断点续爬(雪球舆情)
用户:上次雪球爬到一半断了,继续
AI:读取 data/runs/xueqiu/<timestamp>/articles.jsonl
→ 已抓 47 条,跳过集合已构建
→ 从第 48 条继续,并发 6
🚫 合规红线(必读,违反即拒)
本 skill 坚持合法、合规、尊重版权与平台规则。以下模块有严格边界,任何越权使用意图都会被直接拒绝(返回 blocked 标记,不执行):
| 模块 | 合规边界 | 严禁事项 |
|---|---|---|
| gzh_adapter | 仅「用户已授权/自有/手动提供文章 URL」的单篇正文抽取 | 绕过微信登录态、逆向协议(wechaty非官方)、批量爬非授权号历史文章 |
| academic_cnki_adapter | 仅「已购知网权限的机构网络(校园网/VPN)」下的文献元数据抽取 | 绕过付费墙、盗版镜像、逆向加密接口、批量下载受版权全文 |
| wind_proxy_adapter | 仅「已合法持有 Wind 授权(WindPy)」环境的接口转发占位 | 破解/绕过/批量抓取 Wind 终端;无授权即拒绝,推荐 cninfo+tushare 替代 |
| itjuzi_adapter | 仅采集公开预览页 | 破解会员墙、批量抓取付费字段、模拟登录 |
通用原则:不爬取需登录态的私域数据、不破解付费墙、不逆向任何平台协议、不批量 mirror 受版权保护的站点。合规替代路径:学校图书馆数字资源(知网/Wind/万得)、官方导出接口、开放获取(OA)文献。
凭证管理:所有 API Token / Cookie 仅存于本地私有文件 data/config.json(分发包内为空模板,不随包分发)。测试脚本 scripts/v2_test_suite.py 从该文件或环境变量 TUSHARE_TOKEN 读取凭证,未配置时自动跳过真实 API 测试,不硬编码任何凭证。
❓ 常见问题(FAQ)
Q1: 爬巨潮公告成功率高吗? A: 85%+。公告索引走官方 JSON 接口很稳定;PDF 下载注意 Content-Type 校验。
Q2: 没有 Playwright 能干什么? A: 核心功能(HTTP 爬取/索引/文档生成)不需要。只有 SPA 站点(MBB/智库/统计局部分页面)才需要。
Q3: 商赛要用 Wind 数据怎么办? A: 本 skill 明确不爬 Wind(付费终端)。替代:巨潮年报 PDF 提取财务比率(financial_metrics consumer)+ 学校图书馆数字资源。
Q4: 雪球 cookie 怎么拿?
A: 浏览器登录 xueqiu.com → F12 → Application → Cookies → 复制 xq_a_token → 填入 data/config.json。
Q5: 为什么 CSV 在 Excel 里中文乱码?
A: 已用 utf-8-sig(带 BOM)编码,Excel 可直接打开。若仍乱码,用"数据→自文本导入→UTF-8"。
Scan to join WeChat group