Python股票行情看板

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zym326975/article/details/102052306
# -*- coding: utf-8 -*-

import csv
import numpy as np
import time
from bottle import template
import requests

"""

github: https://github.com/geeeeeeeek/py_stock

"""


def top_ten_by_price(sub_li):
    """
    股价排名
    """
    sub_li.sort(key=lambda x: float(x[1]), reverse=True)
    return sub_li[0:10]


def top_ten_by_range(sub_li):
    """
    涨幅排名
    """
    sub_li.sort(key=lambda x: float(x[3]), reverse=True)
    return sub_li[0:10]


def top_ten_by_range_r(sub_li):
    """
    跌幅排名
    """
    sub_li.sort(key=lambda x: float(x[3]))
    return sub_li[0:10]


def top_ten_by_volume(sub_li):
    """
    成交量排名
    """
    sub_li.sort(key=lambda x: float(x[4]), reverse=True)
    return sub_li[0:10]


def top_ten_turn_volume(sub_li):
    """
    成交额排名
    """
    sub_li.sort(key=lambda x: float(x[5]), reverse=True)
    return sub_li[0:10]


def request_to_list(r_flatten_list, group_step):

    r_stock_list = []
    # 分组处理, 步长group_step
    for i in range(0, len(r_flatten_list), group_step):
        sub_list = r_flatten_list[i:i + group_step]
        sub_flatten_str = ",".join(sub_list)
        #print(sub_flatten_str)
        r = requests.get("http://hq.sinajs.cn/list=" + sub_flatten_str)
        if r.status_code == 200:
            #print("=======", str(i), "success========")
            split_lines_list = r.text.splitlines()
            #print(split_lines_list)
            for line in split_lines_list:
                stock_id = line[line.find("=") - 8:line.find("=")]
                # 格式: var hq_str_sh201004="R091,0.000,4.450,4.450,2019-02-20,11:30:00,03";
                # 分离等号后面的字段
                right_str = line[line.find("\"") + 1:line.rindex("\"")]
                #print(right_str)
                if len(right_str) > 0:
                    stock_field_list = right_str.split(",")
                    stock_field_list[1] = round(float(stock_field_list[1]), 2)
                    if stock_field_list[1] > 0:
                        stock_field_list.append(stock_id)
                        r_stock_list.append(stock_field_list)
    print(r_stock_list)
    return r_stock_list

if __name__ == '__main__':

    TEMPLATE = "template.html"
    INDEX_HTML = "index.html"
    CSV_PATH = "stock.csv"

    with open(CSV_PATH, 'r') as f:
        reader = csv.reader(f)
        your_list = list(reader)

        # list扁平化 [['a'],['b'],['c']] ==> ['a','b','c']
        flatten_list = np.array(your_list).flatten().tolist()
        del flatten_list[0]

        print(flatten_list)

        stock_list = request_to_list(flatten_list, 50)

        price_list = top_ten_by_price(stock_list)
        print(price_list)
        range_list = top_ten_by_range(stock_list)
        print(range_list)
        range_r_list = top_ten_by_range_r(stock_list)
        print(range_r_list)
        volume_list = top_ten_by_volume(stock_list)
        turn_volume_list = top_ten_turn_volume(stock_list)

        context = dict()
        context["price_list"] = price_list
        context["range_list"] = range_list
        context["range_r_list"] = range_r_list
        context["volume_list"] = volume_list
        context["turn_volume_list"] = turn_volume_list
        context["stock_list"] = stock_list

        html = template(TEMPLATE, items=context)

        with open(INDEX_HTML, 'wt') as f:
            #f.write(str(html.encode('utf-8')))
            f.write(str(html))
            print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
            print("=======success========")
            f.close()

stock_id
s_sh201000
s_sh201001
s_sh201002
s_sh201003
s_sh201004
s_sh201005
s_sh201008
s_sh201009
s_sh201010
s_sh202001
s_sh202003
s_sh202007
s_sh203007
s_sh203008
s_sh203009
s_sh203016
s_sh203017
s_sh203018
s_sh203019
s_sh203020
s_sh203021
s_sh203031
s_sh203032
s_sh203033
s_sh203040
s_sh203041
s_sh203042
s_sh203043
s_sh203044
s_sh203045
s_sh203049
s_sh203050
s_sh203051
s_sh203052
s_sh203053
s_sh203054
s_sh204001
s_sh204002
s_sh204003
s_sh204004
s_sh204007
s_sh204014
s_sh204028
s_sh204091
s_sh204182
s_sh500001
s_sh500002
s_sh500003
s_sh500005
s_sh500006
s_sh500007
s_sh500008
s_sh500009
s_sh500010
s_sh500011
s_sh500013
s_sh500015
s_sh500016
s_sh500017
s_sh500018
s_sh500019
s_sh500021
s_sh500025
s_sh500028
s_sh500029
s_sh500035
s_sh500038
s_sh500039
s_sh500056
s_sh500058
s_sh501000
s_sh501001
s_sh501002
s_sh501003
s_sh501005
s_sh501007
s_sh501008
s_sh501009
s_sh501010
s_sh501011
s_sh501012
s_sh501015
s_sh501016
s_sh501017
s_sh501018
s_sh501019
s_sh501020
s_sh501021
s_sh501022
s_sh501023
s_sh501025
s_sh501026
s_sh501027
s_sh501028
s_sh501029
s_sh501030
s_sh501031
s_sh501032
s_sh501035
s_sh501036
s_sh501037
s_sh501038
s_sh501039
s_sh501040
s_sh501043
s_sh501045
s_sh501046
s_sh501047
s_sh501048
s_sh501049
s_sh501050
s_sh501051
s_sh501053
s_sh501054
s_sh501057
s_sh501058
s_sh501059
s_sh501060
s_sh501061
s_sh501062
s_sh501067
s_sh501068
s_sh501106
s_sh501300
s_sh501301
s_sh501302
s_sh501303
s_sh501305
s_sh501306
s_sh501307
s_sh501309
s_sh501310
s_sh502000
s_sh502001
s_sh502002
s_sh502003
s_sh502004
s_sh502005
s_sh502006
s_sh502007
s_sh502008
s_sh502010
s_sh502011
s_sh502012
s_sh502013
s_sh502014
s_sh502015
s_sh502016
s_sh502017
s_sh502018
s_sh502020
s_sh502021
s_sh502022
s_sh502023
s_sh502024
s_sh502025
s_sh502026
s_sh502027
s_sh502028
s_sh502031
s_sh502032
s_sh502036
s_sh502037
s_sh502038
s_sh502040
s_sh502041
s_sh502042
s_sh502048
s_sh502049
s_sh502050
s_sh502053
s_sh502054
s_sh502055
s_sh502056
s_sh502057
s_sh502058
s_sh505888
s_sh510010
s_sh510020
s_sh510030
s_sh510050
s_sh510060
s_sh510070
s_sh510090
s_sh510110
s_sh510120
s_sh510130
s_sh510150
s_sh510160
s_sh510170
s_sh510180
s_sh510190
s_sh510210
s_sh510220
s_sh510230
s_sh510260
s_sh510270
s_sh510280
s_sh510290
s_sh510300
s_sh510310
s_sh510330
s_sh510360
s_sh510380
s_sh510390
s_sh510410
s_sh510420
s_sh510430
s_sh510440
s_sh510450
s_sh510500
s_sh510510
s_sh510520
s_sh510550
s_sh510560
s_sh510580
s_sh510590
s_sh510600
s_sh510610
s_sh510620
s_sh510630
s_sh510650
s_sh510660
s_sh510680
s_sh510700
s_sh510710
s_sh510800
s_sh510810
s_sh510880
s_sh510900
s_sh511010
s_sh511210
s_sh511220
s_sh511230
s_sh511260
s_sh511270
s_sh511280
s_sh511290
s_sh511310
s_sh511600
s_sh511620
s_sh511650
s_sh511660
s_sh511670
s_sh511680
s_sh511690
s_sh511700
s_sh511760
s_sh511770
s_sh511800
s_sh511810
s_sh511820
s_sh511830
s_sh511850
s_sh511860
s_sh511880
s_sh511890
s_sh511900
s_sh511910
s_sh511920
s_sh511930
s_sh511950
s_sh511960
s_sh511970
s_sh511980
s_sh511990
s_sh512000
s_sh512010
s_sh512040
s_sh512070
s_sh512090
s_sh512100
s_sh512110
s_sh512120
s_sh512150
s_sz300756
s_sz300757
s_sz300758
s_sz300759
s_sz300760
s_sz300761
.fr{
    float:right;
}
.fl{
    float:left;
}
.page {
    background: #333;
}
.banner{
    padding: 30px 30px;
}

.banner-item{
    padding: 2px 6px;
	background-color: #000;
	border-radius: 5px;
	color: #fff;
}

.banner-item-name{
    font-size:13px;
    color: #ddd;
}

.content{
    padding:10px 2px;
}

.stock-list {
	list-style: none;
	margin: 0;
	padding: 0;
	text-align: center;
	cursor:default;
}

.stock-list li {
	padding: 2px 6px;
	display: inline-block;
	background-color: #000;
	border-radius: 5px;
	margin: 4px;
	min-width: 120px;
	text-align: center;
	cursor:default;
}

.stock-list .stock-name{
    float: left;
    font-size: 12px;
    color: #ddd;
}

.stock-list .stock-price{
    float:right;
    font-size: 13px;
}

.red{
    color:#f00;
}

.green{
    color:#00ff00;
}
<html lang="en">
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="https://cdn.staticfile.org/semantic-ui/2.4.1/semantic.min.css">
    <link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<title>python股市行情看板</title>
<body>

<div class="page">
    <div class="banner">
        <div class="ui stackable four column grid">
            <div class="column">
                <div class="ui inverted segment">
                    <div class="">股价排行榜</div>
                    <div class="ui inverted relaxed divided list">
                        % for item in items["price_list"]:
                        <div class="item">
                            <div>
                                <span class="banner-item-name">{{item[0]}}</span>
                                %if float(item[3]) > 0:
                                <span class="fr red" >{{item[1]}}</span>
                                %else:
                                <span class="fr green">{{item[1]}}</span>
                                %end
                            </div>
                        </div>
                        %end
                    </div>
                </div>
            </div>
            <div class="column">
                <div class="ui inverted segment">
                    <div class="">涨幅排行榜</div>
                    <div class="ui inverted relaxed divided list">
                        % for item in items["range_list"]:
                        <div class="item">
                            <div>
                                <span class="banner-item-name">{{item[0]}}</span>
                                <span class="fr red">{{item[3]}}%</span></div>
                        </div>
                        %end
                    </div>
                </div>
            </div>
            <div class="column">
                <div class="ui inverted segment">
                    <div class="">跌幅排行榜</div>
                    <div class="ui inverted relaxed divided list">
                        % for item in items["range_r_list"]:
                        <div class="item">
                            <div>
                                <span class="banner-item-name">{{item[0]}}</span>
                                <span class="fr green">{{item[3]}}%</span></div>
                        </div>
                        %end
                    </div>
                </div>
            </div>
            <div class="column">
                <div class="ui inverted segment">
                    <div class="">成交量排行榜</div>
                    <div class="ui inverted relaxed divided list">
                        % for item in items["volume_list"]:
                        <div class="item">
                            <div>
                                <span class="banner-item-name">{{item[0]}}</span>
                                %if float(item[3]) > 0:
                                <span class="fr red">{{item[4]}}手</span>
                                %else:
                                <span class="fr green">{{item[4]}}手</span>
                                %end
                            </div>
                        </div>
                        %end
                    </div>
                </div>
            </div>
        </div>
    </div>


    <div class="content">
        <ul class="stock-list">
            % for item in items["stock_list"]:
            <li id="{{item[6]}}" onmouseover="mouseOver({{item[6]}})" data-inverted="" data-tooltip="当前价: {{item[1]}}  涨跌幅: {{item[3]}}%" data-position="top center" data-variation="large" >
                <div class="stock-name">
                    {{item[0]}}
                </div>

                %if float(item[3]) > 0:
                <div class="stock-price red">
                    {{item[1]}}
                </div>
                %else:
                <div class="stock-price green">
                    {{item[1]}}
                </div>
                %end
            </li>
            %end
        </ul>
    </div>

</div>
<script src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/semantic-ui/2.4.1/semantic.min.js"></script>
<script>
    function mouseOver(id){
        $('#'+id)
        .popup({
            duration:0
        })
        .popup('show')
    }

    // 30秒刷新
    setTimeout(function(){
        window.location.reload();
    }, 30000)
</script>
</body>
</html>

参考文献

https://github.com/geeeeeeeek/py_stock 

猜你喜欢

转载自blog.csdn.net/zym326975/article/details/102052306