第 3 章 · 02 财报电话会议抓取 本节摘要:本节是「另类数据获取」的实战案例,讲怎么从 Seeking Alpha 网站抓取上市公司财报电话会议(Earnings Call)的转录文本。Earnings Call 是上市公司高管在每季度财报发布后召开的电话会议——先念稿陈述经营结果,再回答分析师提问,是文本类另类数据中信息密度极高的语料。原项目 用 Selenium + Firefox 自动化登录、翻页、抓取,把每场会议拆成陈述、参与者、元数据三类 CSV。本节讲清爬虫的整体架构、为什么用 Selenium 而非 requests、抓取产物的结构,以及它与后续 NLP 章节的衔接。读完本节,你能跑通一条从网页到结构化文本的数据采集流水线。
本节摘要:本节是「另类数据获取」的实战案例,讲怎么从 Seeking Alpha 网站抓取上市公司财报电话会议(Earnings Call)的转录文本。Earnings Call 是上市公司高管在每季度财报发布后召开的电话会议——先念稿陈述经营结果,再回答分析师提问,是文本类另类数据中信息密度极高的语料。原项目
03_alternative_data/02_earnings_calls/sa_selenium.py用 Selenium + Firefox 自动化登录、翻页、抓取,把每场会议拆成陈述、参与者、元数据三类 CSV。本节讲清爬虫的整体架构、为什么用 Selenium 而非 requests、抓取产物的结构,以及它与后续 NLP 章节的衔接。读完本节,你能跑通一条从网页到结构化文本的数据采集流水线。
内容来源:原项目
03_alternative_data/02_earnings_calls/下的sa_selenium.py、README.md、check_data.py,汉化并套用体系化模板。
⚠️ 风险提示:抓取须遵守目标网站的 ToS 与 robots.txt,频率要克制(加随机延时),不得用于商业转售;抓到的文本仅供个人学习研究,情感分析结果不构成投资建议。
阅读完本节,你应当能够:
Earnings Call 在所有文本类另类数据里独树一帜:
| 维度 | Earnings Call 的特点 |
|---|---|
| 信息密度 | 高管亲口陈述 + 分析师追问,信息密集 |
| 时效 | 每季度一次,固定节奏,易对齐 |
| 结构 | 陈述段 + Q&A 段,天然分块 |
| 覆盖度 | 上市公司全覆盖(美股 13000+ 家,年 30000+ 小时) |
| 预测力 | 语气、语速、回避程度都能预示后续走势 |
原项目 README 明确指出:投资者用转录文本评估情感变化、对特定话题的强调程度、以及沟通风格。这三类信号都是后面 NLP 章节(情感分析、主题建模、词嵌入)的核心输入。
💡 核心心法:Earnings Call 的价值不在于「说了什么」(那是 10-K 里有的),而在于「怎么说」——高管的犹豫、回避、用词变化,都可能是 10-K 文本捕捉不到的前瞻信号。
Seeking Alpha 的转录页面是动态渲染的——内容靠 JavaScript 加载,且需要登录才能看完整文本。requests 直接拉 HTML 拿不到正文,所以原项目用 Selenium + Firefox:
Selenium 的角色是「模拟真人浏览器」:它启动一个真实的 Firefox,由 geckodriver 驱动,能执行 JavaScript、维持登录 session、模拟滚动与点击。requests 做不到这些。
依赖准备:
| 组件 | 用途 |
|---|---|
| Firefox 浏览器 | 渲染引擎 |
| geckodriver | 驱动 Firefox 的代理 |
| selenium(Python 包) | 编程接口 |
| beautifulsoup4 | 解析渲染后的 HTML |
⚠️ 警告:不同操作系统的 geckodriver 装法不同——macOS 用
brew install geckodriver,Linux/Windows 要从 GitHub releases 下载并加入 PATH。少了它,Selenium 启动 Firefox 会报WebDriverException。
sa_selenium.py 的核心流程可归纳为:
# 伪码示意,完整实现见原项目 sa_selenium.py from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.get("https://seekingalpha.com/account/login") # ... 登录流程 ... for ticker in ticker_list: driver.get(f"https://seekingalpha.com/symbol/{ticker}/earnings/transcripts") # 等待 JS 渲染完成 # 解析每场会议的链接 for transcript_url in transcript_links: driver.get(transcript_url) html = driver.page_source # 用 BeautifulSoup 解析,拆出: # - content:陈述 + Q&A 正文 # - participants:参会者列表 # - earnings:日期 + 公司 save_csv(ticker, content, participants, earnings)
关键工程细节:
WebDriverWait 等 JS 渲染完,不要硬 sleep。原项目把每场会议拆成三个 CSV,按「抓取的维度」分别落盘到 transcripts/parts/ 下:
| CSV 名 | 内容 | 后续用途 |
|---|---|---|
content |
陈述段 + Q&A 段全文 | NLP 情感/主题分析的主力语料 |
participants |
Seeking Alpha 列出的参会者 | 区分高管 vs 分析家发言 |
earnings |
日期 + 对应公司 | 与市场数据按日期对齐 |
这种「按维度分文件」的设计很关键——情感分析主要用 content,但要用 participants 区分「CEO 的话」与「分析师的问题」,用 earnings 把文本与公告日附近的股价对齐。
抓取网页数据要守规矩:
| 原则 | 实践 |
|---|---|
| 守 ToS | 读目标网站的 Terms of Service,禁止商业抓取的不要碰 |
| 守 robots.txt | 检查 site.com/robots.txt,被 Disallow 的路径不抓 |
| 限速 | 每次请求间随机延时(2~5 秒),高峰期降速 |
| 不二次分发 | 抓到的数据仅供个人研究,不公开 repost |
| 个人信息脱敏 | 如含 PII,使用前脱敏 |
⚠️ 警告:Seeking Alpha 的 ToS 明确禁止商业性抓取。本节示例仅供学习研究,生产环境请走官方 API 或购买数据授权(如 Refinitiv、Bloomberg 的 Earnings Call 库)。
本节抓到的 content 文本是「生语料」,后续章节会依次加工:
| 章节 | 加工 |
|---|---|
| 第 14 章 文本数据与情感 | 分词、停用词、TF-IDF、情感打分 |
| 第 15 章 主题建模 | LSA/NMF/LDA 提取主题 |
| 第 16 章 词嵌入 | Word2Vec/GloVe/BERT 把词转向量,做语义相似度 |
所以本节是 NLP 流水线的「数据采集」起点,真正用 ML 提取信号要在第 14 章之后。
不想自己爬,也可以走付费/官方通道:
{ECO<GO>} 之类的接口。这些渠道省去爬虫工程量,数据更规整,但要花钱。本教程用自建爬虫是为了演示「如何从零创建一个另类数据集」这条路径——这是原书第 3 章的核心教学目的。
content(正文)、participants(角色)、earnings(日期对齐)。下一章,我们进入全书的核心实战——Alpha 因子研究与特征工程,先从「特征工程」方法论讲起,看怎么把原始 OHLCV 变成能预测收益的因子。