在 yfinance 仓库中,scrapers 和 screener 是两个不同但相关的功能模块,主要区别和联系如下:
1. 功能定位不同
scrapers(数据抓取器)
- 定位:底层数据获取工具,负责从雅虎财经页面或 API 中直接抓取原始数据,并解析为结构化格式(如 JSON、DataFrame)。
- 典型场景:抓取股票持有者信息(如机构持有者、内幕交易数据)、实时行情数据、历史价格等。
- 示例模块:
scrapers/holders.py中的Holders类,通过_fetch和_parse方法从网页或 API 提取原始数据并清洗。
screener(筛选器)
- 定位:上层数据筛选工具,基于预设条件或自定义查询,从市场数据中筛选符合条件的股票或资产。
- 典型场景:根据市值、市盈率、行业、地域等指标筛选股票(如“筛选美股中市值 > 1000 亿美元的科技股”)。
- 核心组件:
EquityQuery和Screener类,通过构建查询参数(如exchange,market,sector)调用雅虎财经的筛选 API,返回筛选后的结果列表。
2. 数据流向与协作
scrapers是screener的数据基础:
screener筛选时,可能依赖scrapers提供的原始数据(如从雅虎 API 获取全量市场数据后再过滤),但更常见的是直接通过雅虎的筛选接口(如/v1/screener端点)获取已筛选的结果,减少数据量。screener封装了scrapers的底层操作:
Screener类通过fetch()方法直接返回筛选后的结构化数据(如包含股票代码、名称、指标的 DataFrame),隐藏了底层抓取和解析细节,提供更便捷的高层接口。
3. 代码结构与模块关系
-
scrapers模块:
位于yfinance/scrapers/目录下,包含多个具体抓取器(如holders.py,quotes.py),专注于单一类型数据的获取和解析,代码更底层,可能包含网络请求、HTML 解析(如使用BeautifulSoup)或 API 调用逻辑。 -
screener相关代码:
位于yfinance/base.py或yfinance/screener.py(根据仓库结构),核心类Screener通过组合查询参数(如qopts,filter)生成请求 URL,调用雅虎筛选 API,并解析返回的 JSON 数据为用户友好的格式(如字典列表)。
4. 使用场景对比
| 场景 | scrapers |
screener |
|---|---|---|
| 需求 | 获取某只股票的详细持有者名单 | 筛选所有符合特定财务指标的股票列表 |
| 数据粒度 | 单只股票的深度数据(如前 50 大机构持有者) | 多只股票的概要信息(如代码、市值、市盈率等) |
| 接口复杂度 | 需要指定具体股票代码和数据类型(如 holders) |
需要定义筛选条件(如 market="us", sector="Technology") |
| 返回形式 | 结构化数据(如 DataFrame) | 筛选后的股票列表(含基础指标) |
总结:相辅相成的工具链
scrapers:负责“精准抓取单一类型数据”,是底层数据获取的“工兵”。screener:负责“批量筛选符合条件的资产”,是高层数据筛选的“筛选器”。- 关系:两者均服务于数据获取需求,
screener基于scrapers的底层能力(或直接调用 API 筛选接口),提供更高效的批量筛选功能,而scrapers为screener提供细粒度的数据支持,或用于获取筛选条件中未涵盖的深度数据。
通过组合使用这两个模块,用户可以灵活实现从“原始数据抓取”到“复杂条件筛选”的全流程金融数据处理。