SHA256
121 lines
5.2 KiB
Python
121 lines
5.2 KiB
Python
"""A股数据抓取工具主入口 — BaoStock + 多源容灾
|
||
|
||
用法示例:
|
||
python -m src.main --stock-info # 先抓取股票列表
|
||
python -m src.main --trading-day # 抓取交易日历
|
||
python -m src.main --daily --start-date 20260501 --end-date 20260508
|
||
python -m src.main --financial --symbol 000001
|
||
python -m src.main --dividend
|
||
python -m src.main --intraday # 默认5分钟,近30天
|
||
python -m src.main --intraday --freq all # 全部频率
|
||
python -m src.main --intraday --start-date 20260508 --end-date 20260509
|
||
python -m src.main --intraday --symbol 000001 --freq 30
|
||
python -m src.main --sector # 概念板块及成分股
|
||
python -m src.main --index # 指数日线(上证/沪深300/创业板等)
|
||
python -m src.main --market-daily # 汇总每日涨跌停统计(依赖 stock_daily)
|
||
"""
|
||
|
||
import argparse
|
||
|
||
from src.baostock_conn import bs_login, bs_logout
|
||
from src.config import load_config
|
||
from src.db import init_db
|
||
from src.log import get_logger
|
||
|
||
_logger = get_logger("main")
|
||
|
||
|
||
def main():
|
||
parser = argparse.ArgumentParser(description="A股数据抓取工具(BaoStock + 多源容灾)")
|
||
parser.add_argument("--stock-info", action="store_true", help="抓取股票列表")
|
||
parser.add_argument("--trading-day", action="store_true", help="抓取交易日历")
|
||
parser.add_argument("--daily", action="store_true", help="抓取日线行情")
|
||
parser.add_argument("--source", type=str, default="all",
|
||
choices=["baostock", "sina", "tencent", "eastmoney", "all"],
|
||
help="日线数据源(默认all,轮换使用全部来源)")
|
||
parser.add_argument("--financial", action="store_true", help="抓取季频财务指标")
|
||
parser.add_argument("--dividend", action="store_true", help="抓取分红送转")
|
||
parser.add_argument("--intraday", action="store_true", help="抓取分钟K线行情")
|
||
parser.add_argument("--freq", type=str, default="5",
|
||
choices=["5", "15", "30", "60", "all"],
|
||
help="分钟K线频率(默认5,all=全部)")
|
||
parser.add_argument("--sector", action="store_true", help="抓取概念板块及成分股")
|
||
parser.add_argument("--index", action="store_true", help="抓取指数日线行情")
|
||
parser.add_argument("--market-daily", action="store_true",
|
||
help="汇总每日涨跌停统计(从 stock_daily 聚合)")
|
||
parser.add_argument("--start-date", type=str, help="开始日期 YYYYMMDD")
|
||
parser.add_argument("--end-date", type=str, help="结束日期 YYYYMMDD")
|
||
parser.add_argument("--symbol", type=str, help="指定单只股票代码")
|
||
|
||
args = parser.parse_args()
|
||
|
||
if not any([args.stock_info, args.trading_day, args.daily,
|
||
args.financial, args.dividend, args.intraday,
|
||
args.sector, args.index, args.market_daily]):
|
||
parser.print_help()
|
||
return
|
||
|
||
load_config()
|
||
init_db()
|
||
|
||
# market_daily 只读 stock_daily,无需 BaoStock 登录,提前处理
|
||
if args.market_daily:
|
||
from src.fetchers.market_daily import fetch_market_daily
|
||
fetch_market_daily(start_date=args.start_date, end_date=args.end_date)
|
||
# 若仅运行 market-daily,避免无谓的登录
|
||
if not any([args.stock_info, args.trading_day, args.daily,
|
||
args.financial, args.dividend, args.intraday,
|
||
args.sector, args.index]):
|
||
_logger.info("全部任务完成")
|
||
return
|
||
|
||
# sector 不需要 BaoStock,提前处理
|
||
if args.sector:
|
||
from src.fetchers.sector import fetch_sector
|
||
fetch_sector()
|
||
if not any([args.stock_info, args.trading_day, args.daily,
|
||
args.financial, args.dividend, args.intraday,
|
||
args.index, args.market_daily]):
|
||
_logger.info("全部任务完成")
|
||
return
|
||
|
||
bs_login()
|
||
try:
|
||
if args.stock_info:
|
||
from src.fetchers.stock_list import fetch_stock_list
|
||
fetch_stock_list()
|
||
|
||
if args.trading_day:
|
||
from src.fetchers.trading_day import fetch_trading_days
|
||
fetch_trading_days(start_date=args.start_date, end_date=args.end_date)
|
||
|
||
if args.daily:
|
||
from src.fetchers.daily import fetch_daily
|
||
fetch_daily(start_date=args.start_date, end_date=args.end_date,
|
||
source=args.source)
|
||
|
||
if args.financial:
|
||
from src.fetchers.financial import fetch_financial
|
||
fetch_financial(symbol=args.symbol)
|
||
|
||
if args.dividend:
|
||
from src.fetchers.dividend import fetch_dividend
|
||
fetch_dividend(symbol=args.symbol)
|
||
|
||
if args.intraday:
|
||
from src.fetchers.intraday import fetch_intraday
|
||
fetch_intraday(start_date=args.start_date, end_date=args.end_date,
|
||
symbol=args.symbol, freq=args.freq)
|
||
|
||
if args.index:
|
||
from src.fetchers.index import fetch_index
|
||
fetch_index(start_date=args.start_date, end_date=args.end_date)
|
||
|
||
_logger.info("全部任务完成")
|
||
finally:
|
||
bs_logout()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|