"""
股票数据获取程序,并写入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