Py学习  »  Python

【Python技术】获取同花顺概念指数对应股

子晓聊技术 • 6 月前 • 534 次点击  
背景: 群里有同学想获取同花顺概念指数对应股,周末抽空写了个例子。样式比较丑, 主要是演示下通过概念获取对应的股票池,并支持下载功能。
 完整代码如下:
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()

代码比较简单,主要实现了2个功能。
1、获取同花顺所有的概念指数,这个功能之前就有
2、根据概念指数code获取股票池
上面截图的是DeepSeek概念股的数据。在写streamlit这个例子的时候, 我会发现streamlit 做界面样式 和 前后端分离做 还是差了一点意思。
比如我本想上方的概念指数板块做一个固定高度超过滚动效果的, 试了下markdown来调整样式,花了点时间,调整了未生效。 想了下自己只是单纯演示下爬取数据,就临时先这样了。

上面的代码仅供学习研究使用, 不要用于商业用途。

历史文章推荐:
【Python技术】问DeepSeek处理日历库获取交易日几种实现方式
【Python技术】同花顺wencai涨停分析基础上增加连板分析
【Python技术】利用同花顺wencai进行竞价数据分析
【Python技术】A股涨停最高板多个情况展示并附上表格明细
【Python技术】提取新闻联播热点内容分析并让大模型给出投资建议
[Python技术]利用akshare获取股票基本信息、K线图、最新新闻 以及大模型投资建议

【Python技术】利用akshare获取A股公告,并通过关键字获取自己想要的内容

【Python技术】利用tushare、wencai分析某天涨停股票次日涨跌幅情况

[Python技术]利用streamlit构建多页面应用功能

【开源项目】发现一开源项目,小白也能轻松玩转股票量化交易

【开源项目】一款基于JAVA的AI开源量化交易平台Northstar

小白入门量化交易,这几款软件不容错过!

【开源项目】推荐一款A股自动选股程序Sequoiad





Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/179158
 
534 次点击