获取A股行业、股价信息

"""
股票数据获取程序,并写入get_stocks.xslx文件
"""

import pandas as pd
import requests
import logging
import os

def fetch_stock_data(stock_code):
    """
    获取股票数据的核心函数
    
    参数:
    stock_code (str): 股票代码,如"688360"
    
    返回:
    dict: 包含股票数据的字典
    """
    # 配置日志记录
    logging.basicConfig(level=logging.INFO, 
                        format='%(asctime)s - %(levelname)s - %(message)s')
    logger = logging.getLogger('StockDataFetcher')
    
    # 原始API端点
    api_url = "https://push2.eastmoney.com/api/qt/stock/get"
    
    try:
        # 6开头为沪市(代码1),其他为深市(代码0)
        market_code = 1 if stock_code.startswith("6") else 0
        
        # 构建请求参数
        request_params = {
            "fltt": "2",
            "invt": "2",
            "fields": "f57,f58,f84,f85,f127,f116,f117,f189,f43",
            "secid": f"{market_code}.{stock_code}",
        }
        
        logger.info(f"正在请求股票数据: {stock_code}")
        
        # 发送API请求(超时处理)
        response = requests.get(api_url, params=request_params, timeout=10)
        response.raise_for_status()  # 检查HTTP状态码
        
        logger.info("数据获取成功")
        return response.json()
    
    except requests.exceptions.RequestException as e:
        logger.error(f"请求失败: {e}")
        return None
    except Exception as e:
        logger.error(f"处理过程中发生错误: {e}")
        return None

def process_stock_data(raw_data):
    """
    处理从API获取的原始股票数据
    
    参数:
    raw_data (dict): API返回的原始数据
    
    返回:
    pd.DataFrame: 处理后的股票数据
    """
    if not raw_data or "data" not in raw_data:
        return pd.DataFrame()
    
    # 原始字段到中文名称的映射
    field_mapping = {
        "f57": "股票代码",
        "f58": "股票简称",
        "f84": "总股本",
        "f85": "流通股",
        "f127": "行业",
        "f116": "总市值",
        "f117": "流通市值",
        "f189": "上市时间",
        "f43": "最新价",
    }
    
    try:
        # 提取核心数据
        stock_data = raw_data.get("data", {})
        
        # 创建数据列表 - 使用列表推导式更高效
        processed_data = []
        for field, display_name in field_mapping.items():
            # 只处理存在的字段
            if field in stock_data:
                processed_data.append({
                    "字段标识": field,
                    "项目": display_name,
                    "数值": stock_data[field]
                })
        
        # 转换为DataFrame
        df = pd.DataFrame(processed_data)
        
        # 如果数据为空,返回空DataFrame
        if df.empty:
            return df
        
        # 仅保留需要的列
        return df[["项目", "数值"]]
    
    except Exception as e:
        logging.error(f"数据处理失败: {e}")
        return pd.DataFrame()

def display_stock_info(stock_code):
    """
    显示股票信息的主函数
    
    参数:
    stock_code (str): 股票代码
    """
    
    # 获取原始数据
    raw_data = fetch_stock_data(stock_code)
    
    if not raw_data:
        print(f"无法获取股票 {stock_code} 的数据")
        return
    
    # 处理数据
    stock_df = process_stock_data(raw_data)
    
    if stock_df.empty:
        print(f"股票 {stock_code} 的数据处理失败")
        return
    
    # 格式化输出
    print("\n股票信息:")
    print(stock_df.to_string(index=False))
    print("\n")

    file_path = 'get_stocks.xlsx'
    try:
        # 检查文件是否存在
        file_exists = os.path.isfile(file_path)
        mode = 'a' if file_exists else 'w'
        writer_kwargs = {
            'engine': 'openpyxl',
            'mode': mode
        }
        if mode == 'a':
            writer_kwargs['if_sheet_exists'] = 'replace'
        with pd.ExcelWriter(file_path, **writer_kwargs) as writer:
            stock_df.to_excel(writer, sheet_name=stock_code, index=False)
        print(f"股票 {stock_code} 的数据已成功写入 {file_path}")
    except Exception as e:
        print(f"写入股票 {stock_code} 数据到 Excel 时出错: {e}")

# 主程序
if __name__ == "__main__":
    # 示例股票代码 - 包含不同市场的股票
    stock_codes = ["601288","000937","688360", "603300", "002195", "300014"]
    
    # 为每个股票代码获取并显示信息
    for code in stock_codes:
        display_stock_info(code)

PS C:\Users\czliu> & “C:/Program Files/Python313/python.exe” c:/Users/czliu/Documents/python/stocks_get.py
2025-07-17 18:26:35,917 – INFO – 正在请求股票数据: 601288
2025-07-17 18:26:36,043 – INFO – 数据获取成功

股票信息:
项目 数值
股票代码 601288
股票简称 XD农业银
总股本 349983033873.0
流通股 319244210777.0
行业 银行
总市值 2145395997641.48999
流通市值 1956967012063.01001
上市时间 20100715
最新价 6.13

股票 601288 的数据已成功写入 get_stocks.xlsx
2025-07-17 18:26:36,282 – INFO – 正在请求股票数据: 000937
2025-07-17 18:26:36,385 – INFO – 数据获取成功

股票信息:
项目 数值
股票代码 000937
股票简称 冀中能源
总股本 3533546850.0
流通股 3433394152.0
行业 煤炭行业
总市值 20847926415.0
流通市值 20257025496.800003
上市时间 19990909
最新价 5.9

股票 000937 的数据已成功写入 get_stocks.xlsx
2025-07-17 18:26:36,432 – INFO – 正在请求股票数据: 688360
2025-07-17 18:26:36,530 – INFO – 数据获取成功

股票信息:
项目 数值
股票代码 688360
股票简称 德马科技
总股本 263745667.0
流通股 252286035.0
行业 通用设备
总市值 5617782707.1
流通市值 5373692545.5
上市时间 20200602
最新价 21.3

股票 688360 的数据已成功写入 get_stocks.xlsx
2025-07-17 18:26:36,582 – INFO – 正在请求股票数据: 603300
2025-07-17 18:26:36,678 – INFO – 数据获取成功

股票信息:
项目 数值
股票代码 603300
股票简称 海南华铁
总股本 1990650596.0
流通股 1990650596.0
行业 专用设备
总市值 23230892455.32
流通市值 23230892455.32
上市时间 20150529
最新价 11.67

股票 603300 的数据已成功写入 get_stocks.xlsx
2025-07-17 18:26:36,716 – INFO – 正在请求股票数据: 002195
2025-07-17 18:26:36,813 – INFO – 数据获取成功

股票信息:
项目 数值
股票代码 002195
股票简称 岩山科技
总股本 5681544596.0
流通股 5612251612.0
行业 互联网服务
总市值 32043911521.439999
流通市值 31653099091.679996
上市时间 20071212
最新价 5.64

股票 002195 的数据已成功写入 get_stocks.xlsx
2025-07-17 18:26:36,868 – INFO – 正在请求股票数据: 300014
2025-07-17 18:26:36,966 – INFO – 数据获取成功

股票信息:
项目 数值
股票代码 300014
股票简称 亿纬锂能
总股本 2045721497.0
流通股 1861434646.0
行业 电池
总市值 92057467365.0
流通市值 83764559070.0
上市时间 20091030
最新价 45.0

股票 300014 的数据已成功写入 get_stocks.xlsx