| name | 10jqka-scraper |
| description | 抓取同花顺 F10 (basic.10jqka.com.cn) A 股公司全栏目数据。覆盖 14 个栏目(最新动态、公司资料、股东研究、经营分析、股本结构、资本运作、盈利预测、新闻公告、概念题材、主力持仓、财务分析、分红融资、公司大事、行业对比),自动过滤 UI 噪声、提取隐藏 JSON(联动新闻 / 研报列表)、结构化事件日期。典型用法:1) 命令行 `python 10jqka_scraper.py 000636` 抓全栏目;2) 在 Python 中 `import 10jqka_scraper` 调 `scrape_section(code, '公司大事', 'event.html')` 按需抓单栏目。 |
| description_zh | 同花顺 F10 数据抓取工具 |
| description_en | 10jqka F10 financial-data scraper for Chinese A-shares |
| version | 2.0.0 |
| license | MIT |
| metadata | {"version":"2.0","category":"finance","source":"https://basic.10jqka.com.cn/{stock_code}/"} |
| display_name | 10jqka F10 Scraper |
| display_name_en | 10jqka F10 Scraper |
| visibility | public |
10jqka F10 Scraper
抓取同花顺 F10 公开数据(basic.10jqka.com.cn)的 A 股公司全栏目信息。
用途
A 股公司基本面 / 长尾信息抓取:
- 公司基本资料、股东研究、股本结构、概念题材等结构化信息
- 联动新闻(数百条)、研报列表(数十篇)、公司大事事件流
- 三大报表关键科目(注意:详细数值请用专业行情数据源)
- 任何需要 F10 长尾数据的离线分析、报告生成、LLM 上下文
14 个栏目
| 栏目 | URL 后缀 | 主要数据 |
|---|
| 最新动态 | ""(首页) | 近期事件聚合 + 关键指标快照 |
| 公司资料 | company.html | 基本信息、所属行业、法定代表人、注册地址 |
| 股东研究 | holder.html | 十大股东、流通股东、机构持股、股东户数 |
| 经营分析 | operate.html | 主营收入按行业 / 产品 / 地区拆分 |
| 股本结构 | equity.html | 总股本 / 流通 / 限售 |
| 资本运作 | capital.html | 定增 / 配股 / 可转债 / 并购历史 |
| 盈利预测 | worth.html | 分析师 EPS / 净利润一致预测 |
| 新闻公告 | news.html | 联动新闻 + 公告 + 研报(隐藏 JSON 解析) |
| 概念题材 | concept.html | 所属概念板块、涨停基因 |
| 主力持仓 | position.html | 基金 / QFII / 社保、机构持股比例 |
| 财务分析 | finance.html | 三大报表关键科目 + 主要财务指标 |
| 分红融资 | bonus.html | 历年分红方案、增发配股 |
| 公司大事 | event.html | 近期重要事件(日期 / 类型 / 详情) |
| 行业对比 | field.html | 同行业公司核心指标对比 |
调用方式
方式 1:命令行(全栏目抓取)
python {baseDir}/scripts/10jqka_scraper.py 000636
- 触发 14 次 HTTP,约 8-15 秒
- 写入同目录
_000636_f10_data.json
- 同时 stdout 输出 JSON(UTF-8)
无参数会交互式提示输入股票代码。
方式 2:Python 库导入
把脚本所在目录加入 sys.path 后:
import 10jqka_scraper as jq
data = jq.scrape_section("000636", "公司大事", "event.html")
all_data = jq.scrape_all("000636")
cleaned = jq.clean_text(data)
sections = jq.extract_all_tables_as_dicts(soup)
summary = jq._extract_summary_from_soup(soup)
公开 API
| 函数 | 说明 |
|---|
scrape_all(stock_code) | 全栏目抓取,返回 {stock_code, url_base, data: {栏目名: 栏目数据}} |
scrape_section(stock_code, section_name, page_name) | 单栏目抓取(1 次 HTTP) |
clean_text(data) | 递归清洗文本中的特殊空白 |
extract_all_tables_as_dicts(soup) | 提取所有表格为 dict 列表 |
SECTION_PAGES | 栏目名 → URL 后缀 的映射字典 |
scrape_section 第三个参数 page_name 取 SECTION_PAGES[section_name] 的值。
数据返回结构
所有 parse_* 函数返回统一结构:
{
"sections": [
{
"title": "详细情况",
"data": [{"key": "value", ...}, ...],
"content": "..."
},
...
],
"summary": "...",
"events": [{"date": "2025-01-15", "type": "公告", "detail": "..."}, ...],
"news_list": [...],
"announcements": [...],
"reports": [...],
"key_indicators": [...],
"basic_info": {...},
}
依赖
- Python 3.8+
requests >= 2.28
beautifulsoup4 >= 4.12
lxml >= 4.9(HTML 解析器,备用)
安装:
pip install requests beautifulsoup4 lxml
已知限制
- 反爬限流:未加代理池,单 IP 连续抓全栏目可能触发同花顺限流。生产环境建议加入
time.sleep(1)、缓存复用、User-Agent 轮换等
- 动态加载:部分栏目的部分板块靠 AJAX 拉取,本 scraper 只抓 SSR 部分
- 编码兜底:10jqka 部分页面用 GBK,编码处理已做
UTF-8 → GB18030 → GBK → latin1 兜底
- DOM 选择器耦合:
m_box / hd / bd 等 class 是基于 2026-04 站点快照,同花顺改版后可能要更新选择器
故障排查
| 症状 | 排查 |
|---|
ModuleNotFoundError: requests | pip install requests beautifulsoup4 lxml |
| 抓全栏目超时 | 改用 scrape_section 按需抓取 |
标题仍是 table_0 | 站点改版;检查 _extract_hd_bd_sections 的 m_box 选择器 |
| 摘要含 UI 噪声 | 更新 UI_NOISE_PATTERNS 列表 |
| 联动新闻 / 研报空 | 检查 <div style="display:none" id="linkagedata"> 节点是否还在 |
许可
MIT