一个基于多线程生产者-消费者架构的高性能股票数据爬虫系统,支持6个主流数据源的实时和历史数据采集。
- 6个消费者线程并发运行,大幅提升爬取效率
- 线程安全的统计信息管理
- 队列任务分配机制,确保负载均衡
- 优雅的线程生命周期管理和错误处理
- 新浪财经:支持历史数据爬取,覆盖A股市场
- 腾讯财经:支持实时和历史数据,数据更新及时
- 东方财富:支持实时数据,数据质量高
- Akshare:高质量金融数据接口
- Baostock:专业金融数据平台
- Yahoo Finance:国际数据源,支持全球市场
- 实时数据和历史数据双模式支持
- 数据验证和对比功能
- 自动去重和数据清洗
- 技术指标计算(MA、RSI等)
- 情感分析和LLM智能分析
stock_scraper/
├── crawler/ # 爬虫模块
│ ├── multi_source_crawler.py # 多线程实时数据爬虫
│ ├── multi_source_history_crawler.py # 多线程历史数据爬虫
│ ├── sina/ # 新浪财经爬虫
│ ├── tencent/ # 腾讯财经爬虫
│ ├── eastmoney/ # 东方财富爬虫
│ ├── baostock/ # Baostock爬虫
│ └── yahoo_finance/ # Yahoo Finance爬虫
├── utils/ # 工具模块
│ ├── stock_database.py # 数据库操作
│ ├── akshare_data.py # Akshare数据接口
│ ├── data_saver.py # 数据保存
│ ├── deduplication.py # 数据去重
│ ├── sentiment_calculator.py # 情感分析
│ └── llm_analyzer.py # LLM分析
├── app/ # Web应用
│ ├── main.py # Flask应用主程序
│ ├── models/ # 数据模型
│ ├── templates/ # HTML模板
│ └── static/ # 静态资源
├── config/ # 配置文件
│ └── settings.py # 配置管理
├── requirements.txt # Python依赖
└── README.md # 项目说明
- Python 3.8+
- SQLite 3
- 依赖库:见 requirements.txt
pip install -r requirements.txt编辑 config/settings.py,配置数据库路径:
DATABASE_PATH = "/path/to/your/database.db"python crawler/multi_source_crawler.pypython crawler/multi_source_history_crawler.pypython app/main.py详细的数据库表结构请参考 DATABASE_SCHEMA.md
- stock_list: 股票列表
- merged_stocks: 合并的股票数据
- data_status: 数据状态跟踪
- stock_news: 股票新闻
- stock_announcements: 公告信息
- stock_comments: 评论数据
- analyst_reports: 分析师报告
- stock_sentiment_scores: 情感评分
- stock_classifications: 股票分类
# 最大调用次数限制
MAX_CALLS = 5000
# 测试模式
TEST_MODE = True
# 目标日期
TARGET_DATE = "2026-02-13"每个数据源都有独立的配置选项,可以在对应的爬虫文件中修改。
- 并发处理:6个线程同时工作,大幅提升效率
- 智能重试:失败自动重试机制
- 数据验证:多维度数据质量检查
- 内存优化:流式处理,避免内存溢出
- 错误恢复:完善的异常处理和日志记录
- 在
crawler/下创建新的数据源目录 - 实现爬虫类,继承
BaseWorker - 在
multi_source_crawler.py中注册新的Worker - 测试数据质量和性能
修改 utils/ 下的工具类,实现自定义的数据处理逻辑。
from crawler.multi_source_crawler import MultiSourceRealTimeCrawler
crawler = MultiSourceRealTimeCrawler(
db_path="/path/to/database.db",
test_mode=False
)
# 爬取指定股票
stocks = ["000001", "600519", "000858"]
stats = crawler.crawl(stocks, "2026-02-13")
print(f"成功: {stats['success']}, 失败: {stats['failure']}")from utils.stock_database import StockDatabase
with StockDatabase("/path/to/database.db") as db:
# 获取股票数据
data = db.get_stock_data("000001", "2026-02-13")
print(data)
# 获取所有股票代码
codes = db.get_all_stock_codes()
print(f"共有 {len(codes)} 只股票")欢迎提交Issue和Pull Request!
MIT License
- GitHub: https://github.com/riching/stock_scraper
- Issues: https://github.com/riching/stock_scraper/issues
感谢所有开源数据源和工具的支持!
注意:本系统仅用于学习和研究目的,请遵守相关数据源的使用条款和法律法规。