背景: 群里有同学想获取同花顺概念指数对应股,周末抽空写了个例子。样式比较丑, 主要是演示下通过概念获取对应的股票池,并支持下载功能。import streamlit as st
import pywencai
import requests
import json
import pandas as pd
# 启用Streamlit缓存
@st.cache_data(ttl=3600) # 缓存1小时
def get_concept_index():
"""获取概念指数数据并缓存"""
return pywencai.get(query="同花顺概念指数", query_type="zhishu", sort_order='desc', loop=True)
def app():
st.title("同花顺概念指数")
# 初始化session状态
if'selected_code' not in st.session_state:
st.session_state.selected_code = None
# 第一部分:概念指数列表(使用缓存)
with st.container():
st.subheader("概念指数列表")
df = get_concept_index()
# 创建带有点击事件的表格
for _, row in df.iterrows():
cols = st.columns([1, 4, 2])
with cols[0]:
# 使用按钮替代链接实现局部更新
if st.button(row['code'], key=f"btn_{row['code']}"):
st.session_state.selected_code = row['code']
cols[1].write(row['指数简称'])
st.write(f"总共显示 {len(df)} 个概念指数")
# 第二部分:成分股展示(动态更新)
if st.session_state.selected_code:
with st.container():
st.subheader(f"概念指数 {st.session_state.selected_code} 成分股列表")
show_stock_list(st.session_state.selected_code)
def show_stock_list(code):
"""显示成分股的独立组件"""
# 构造请求URL
url = f"https://d.10jqka.com.cn/v2/blockrank/{code}/199112/d1000.js"
headers = {
'Referer': 'http://q.10jqka.com.cn/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
try:
with st.spinner("正在加载成分股..."):
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
# 处理JSONP数据
json_str = response.text.split('(', 1)[1].rsplit(')', 1)[0]
data = json.loads(json_str)
# 提取并展示数据
stock_list = data.get('items', [])
if stock_list:
stocks_df = pd.DataFrame(
[(s.get('5', '').zfill(6),
s.get('55', ''),
f"{float(s.get('8', 0)):.2f}",
f"{float(s.get('199112', 0)):.2f}%")
for s in stock_list],
columns=['股票代码', '股票名称', '最新价', '涨跌幅']
)
st.dataframe(stocks_df, use_container_width=True)
else:
st.warning("未找到相关个股数据")
else:
st.error(f"请求失败,状态码:{response.status_code}")
except Exception as e:
st.error(f"获取数据时发生错误:{str(e)}")
if __name__ == "__main__":
#st.set_page_config(page_title="同花顺概念指数分析", layout="wide")
app()
上面截图的是DeepSeek概念股的数据。在写streamlit这个例子的时候, 我会发现streamlit 做界面样式 和 前后端分离做 还是差了一点意思。比如我本想上方的概念指数板块做一个固定高度超过滚动效果的, 试了下markdown来调整样式,花了点时间,调整了未生效。 想了下自己只是单纯演示下爬取数据,就临时先这样了。
【Python技术】利用akshare获取A股公告,并通过关键字获取自己想要的内容
【Python技术】利用tushare、wencai分析某天涨停股票次日涨跌幅情况
[Python技术]利用streamlit构建多页面应用功能
【开源项目】发现一开源项目,小白也能轻松玩转股票量化交易
【开源项目】一款基于JAVA的AI开源量化交易平台Northstar
小白入门量化交易,这几款软件不容错过!
【开源项目】推荐一款A股自动选股程序Sequoiad