一个用于从巨潮资讯网(cninfo.com.cn)批量下载上市公司公告的Python工具,支持深交所、上交所、北交所、港股等多个市场的公告查询和PDF文件下载。
- 🔍 多市场支持:支持深交所(szse)、港股(hke)、第三方(third)、基金(fund)、债券(bond)
- 📊 公告分类查询:年报、半年报、季报等各类公告分类筛选
- 📅 时间范围筛选:支持自定义起止时间范围查询
- 🚀 多线程下载:支持并发下载,提高下载效率
- 📁 自动分类存储:按股票代码自动创建目录分类存储
- 🔄 股票数据自动更新:可定期更新股票代码数据库
- Python 3.7+
- 依赖库:
httpx- HTTP客户端库
- 克隆或下载项目文件
- 安装依赖:
pip install httpxfrom CnInfoReports import CnInfoReports
# 初始化(跳过股票数据更新,使用本地stocks.json)
reports = CnInfoReports(skip_download_stock_json=True)
# 设置查询条件
filter_config = {
'market': 'szse', # 市场:szse(深交所)、hke(港股)、third(第三方)、fund(基金)、bond(债券)
'tabName': 'fulltext', # 公告类型:fulltext(全文)、brief(摘要)
'plate': [], # 板块(留空表示全部)
'category': [ # 公告分类
'category_ndbg_szsh', # 年报
'category_bndbg_szsh', # 半年报
'category_sjdbg_szsh', # 季报
'category_yjdbg_szsh' # 预告
],
'industry': [], # 行业(留空表示全部)
'stock': ['000001', '000002'], # 股票代码列表
'searchkey': '', # 标题关键字(可选)
'seDate': '2022-01-01~2023-12-31' # 时间范围:开始日期~结束日期
}
# 查询公告信息(不下载PDF)
announcements = reports.query_announcements_info(filter_config, download_pdf=False)
print(f"查询到 {len(announcements)} 条公告")
# 查询并下载PDF文件
reports.query_announcements_info(filter_config, download_pdf=True)# 更新股票代码数据库(耗时较长,建议偶尔更新)
reports = CnInfoReports(skip_download_stock_json=False)szse- 深交所(深圳证券交易所)hke- 港股(香港交易所)third- 第三方(北交所等)fund- 基金bond- 债券
深交所/上交所常用分类:
category_ndbg_szsh- 年度报告category_bndbg_szsh- 半年度报告category_sjdbg_szsh- 季度报告category_yjdbg_szsh- 业绩预告category_qtgg_szsh- 其他公告
filter_config = {
'market': 'szse',
'tabName': 'fulltext',
'plate': [],
'category': ['category_ndbg_szsh'], # 只下载年报
'industry': [],
'stock': ['000001', '000002'], # 平安银行、万科A
'searchkey': '',
'seDate': '2022-01-01~2023-12-31'
}
reports = CnInfoReports()
reports.query_announcements_info(filter_config, download_pdf=True)filter_config = {
'market': 'szse',
'tabName': 'fulltext',
'plate': [],
'category': ['category_sjdbg_szsh'], # 季报
'industry': [],
'stock': [], # 留空表示所有股票
'searchkey': '',
'seDate': '2023-01-01~2023-12-31'
}
reports = CnInfoReports(max_threads=10) # 增加线程数提高下载速度
reports.query_announcements_info(filter_config, download_pdf=True)filter_config = {
'market': 'szse',
'tabName': 'fulltext',
'plate': [],
'category': ['category_ndbg_szsh'],
'industry': [],
'stock': ['000001'],
'searchkey': '社会责任', # 搜索包含"社会责任"的公告
'seDate': '2022-01-01~2023-12-31'
}
reports = CnInfoReports()
announcements = reports.query_announcements_info(filter_config, download_pdf=True)filter_config = {
'market': 'hke', # 港股市场
'tabName': 'fulltext',
'plate': [],
'category': [], # 港股目前不支持分类筛选
'industry': [],
'stock': ['00700', '00941'], # 腾讯、中国银行
'searchkey': '',
'seDate': '2022-01-01~2023-12-31'
}
reports = CnInfoReports()
reports.query_announcements_info(filter_config, download_pdf=True)下载的文件会按以下结构自动组织:
data/
├── 000001_平安银行/
│ ├── 000001_平安银行_平安银行股份有限公司2022年年度报告_1234567890.pdf
│ └── 000001_平安银行_平安银行股份有限公司2022年半年度报告_1234567891.pdf
├── 000002_万科A/
│ └── 000002_万科A_万科企业股份有限公司2022年年度报告_1234567892.pdf
└── ...
- 调整线程数:根据网络状况调整
max_threads参数(默认5) - 批量操作:一次查询多个股票比多次单个查询效率更高
- 时间范围:合理设置时间范围,避免一次性下载过多文件
- 股票数据更新:股票代码数据不需要频繁更新,建议每周更新一次
A: 可能原因:
- 股票代码格式错误(深交所6位数字,港股5位数字)
- 股票已退市或代码变更
- stocks.json数据过期,可尝试更新:
CnInfoReports(skip_download_stock_json=False)
A: 可以尝试:
- 增加
max_threads参数值 - 检查网络连接
- 减少单次查询的股票数量
A: 程序会自动跳过已存在的文件,如果需要重新下载:
- 删除对应的PDF文件
- 清空data目录重新下载
A: 可以访问巨潮资讯网官网查看完整的公告分类体系,或参考程序中的常用分类。
- 遵守网站规则:请合理使用,避免过于频繁的请求
- 数据仅供参考:下载的公告数据仅供参考,请以官方信息为准
- 存储空间:PDF文件可能占用较大存储空间,请确保有足够的磁盘空间
- 网络环境:程序需要稳定的网络连接,建议在网络状况良好时使用
- v1.0.0: 初始版本,支持基本查询和下载功能
- 修复多线程创建目录的并发问题
- 优化文件命名和存储结构
- 完善文档和使用说明
感谢 xfeng2020/cninf_reports 项目的启发和参考。
本项目仅供学习和研究使用,请遵守相关法律法规和网站使用条款。