社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

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