【python爬虫课程设计】东方股票——数据爬虫+数据可视化

python爬虫课程设计】东方股票——数据爬虫+数据可视化

一、选题的背景

       近年来,东方股票作为中国股市的一部分,其行业地位和影响力较大。在股票市场中,数据的跨度和周期对于投资决策至关重要。本此研究的目标是通过对东方股票数据爬虫,可以有效地获取和分析这些数据,从而帮助投资者做出更明智的投资决策。东方股票的交易数据和信息披露比较完善,这些数据和信息可以为投资者提供较为准确的市场分析和预测,可以更加深入地了解市场的运行规律和趋势。掌握股票投资不仅可以促进中国社会经济的发展,还能激发全民、全社会对股票的热情,提升中国股市的规模和技术水平。因此,此次研究旨在通过数据挖掘和分析的方法,发现股票市场的周期和规律,以实现最大的投资获益。同时,这一研究也有助于提升中国股市的规模和技术水平,推动中国社会经济的发展。

二、主题式网络爬虫设计方案

1.名称:东方股票数据爬虫+数据可视化

2.爬取的数据内容:股票名称,股票代码, 最新价, 涨跌幅, 涨跌额,成交量,成交额, 振幅, 换手率, 市盈率, 量比, 最高, 最低, 今开,昨收, 市净率, 60日涨跌幅, 年初至今涨跌幅, 总市值, 流通市值, 五分钟涨跌。

3.爬虫设计方案概述:本次案例使用request对东方股票进行爬取,使用xlutils对excel文件进行处理,之后使用pandas、pyecharts、jieba对数据进行可视化

4.技术难点:东方股票数据庞大,需要爬虫技术能够高效地获取和处理大量数据,同时要考虑到数据更新的频率和实时性,也要预防访问检测。

三、数据源

我选择share certificate数据集作为实验,数据集(https://quote.eastmoney.com/center/gridlist.html#hs_a_board),该数据集包含股票名称,股票代码, 最新价, 涨跌幅, 涨跌额,成交量,成交额, 振幅, 换手率, 市盈率, 量比, 最高, 最低, 今开,昨收, 市净率, 60日涨跌幅, 年初至今涨跌幅, 总市值, 流通市值, 五分钟涨跌。

四、主题式页面结构分析

1.主题页面的结构与特征分析

东方股票主题页面由多个部分组成,包括导航栏、轮播图、热门板块、自选股、行情走势、资讯等。导航栏位于页面右上角,提供了网站的主要功能入口;轮播图展示了一些重要的股票信息和市场动态;热门板块列出了当前市场上最热门的股票板块;自选股是用户可以自定义的股票列表;行情走势展示了股票的价格走势图表;资讯则提供了最新的股票市场新闻和分析。

2.Htmls 页面解析

3.节点(标签)查找方法与遍历方法

通过data,keys()获取字典键再对其索引遍历,通过get_data获取各国数据,索引前先对data进行分析数据的索引字符串,再通过遍历对需要数据爬取添加。

四、网络爬虫设计

1.爬取到的数据

2.代码实现

将爬虫方法封装为类Spider_XieCheng,在对爬取到的数据进行逐条解析时顺便进行数据清洗

get_data方法:设置请求头以及规则和cookie,发起请求,获取响应数据

analyze_data方法:对传入的数据进行逐条解析,把股票内容进行处理(提前进行数据清洗以方便后面数据可视化绘制图形)

save_excel方法:将传入的数据存储到excel

import json
import requests, time
from tkinter import *
import xlrd, xlwt, os
from xlutils.copy import copy

class GuPiao():
    def __init__(self):
        self.num = 0

    # 爬虫部分
    def spider(self):
        for page in range(1,21):   #这个地方可以页数增加数据
            start_url = 'https://83.push2.eastmoney.com/api/qt/clist/get'
            headers = {
                'Accept': '*/*',
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'Cache-Control': 'no-cache',
                'Connection': 'keep-alive',
                # Requests sorts cookies= alphabetically
                # 'Cookie': 'qgqp_b_id=ffb939776279b0bdd1f6e61281c3c294; st_si=89921490520325; websitepoptg_api_time=1700894106860; websitepoptg_show_time=1700894107214; HAList=ty-1-600789-%u9C81%u6297%u533B%u836F%2Cty-1-600519-%u8D35%u5DDE%u8305%u53F0%2Cty-0-000858-%u4E94%20%u7CAE%20%u6DB2%2Cty-0-002456-%u6B27%u83F2%u5149; st_asi=delete; st_pvi=61091067222435; st_sp=2023-11-03%2018%3A10%3A35; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=5; st_psi=20231125143800994-113200301321-8038820015',
                'Pragma': 'no-cache',
                'Referer': 'https://quote.eastmoney.com/center/gridlist.html',
                'Sec-Fetch-Dest': 'script',
                'Sec-Fetch-Mode': 'no-cors',
                'Sec-Fetch-Site': 'same-site',
                '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',
                'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
                'sec-ch-ua-mobile': '?0',
                'sec-ch-ua-platform': '"Windows"',
            }
            fomdata = {
                'cb': 'jQuery1124001114974346054809_1700894280689',
                'pn': page,
                'pz': '20',
                'po': '1',
                'np': '1',
                'ut': 'bd1d9ddb04089700cf9c27f6f7426281',
                'fltt': '2',
                'invt': '2',
                'wbp2u': '|0|0|0|web',
                'fid': 'f3',
                'fs': 'm:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048',
                'fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152',
                '_': '1700894280699'
            }
            response = requests.get(url=start_url, headers=headers, params=fomdata).text
            response = re.findall('jQuery1124001114974346054809_1700894280689\((.*?)\);', response)[0]
            response = json.loads(response)
            datas = response['data']['diff']
            time.sleep(2)
            self.parase_data(datas)

    # 解析部分
    def parase_data(self, datas):
        for data in datas:
            # 0、序号
            self.num += 1
            # 1、最新价
            zuixingjia = data['f2']
            # 2、涨跌幅
            diezhangfu = str(data['f3']) + '%'
            # 3、涨跌额
            diezhange = data['f4']
            # 4、成交量(手)
            chengjiaoliang = data['f5']
            # 5、成交额
            chengjiaoe = data['f6']
            # 6、振幅
            zhengfu = str(data['f7']) + '%'
            # 7、换手率
            huanshoulv = str(data['f8']) + '%'
            # 8、市盈率
            shiyinglv = data['f9']
            # 9、量比
            liangbi = data['f10']
            # 10、股票代码
            diama = data['f12']
            # 11、股票名称
            name = data['f14']
            # 12、最高
            zuigao = data['f15']
            # 13、最低
            zuidi = data['f16']
            # 14、今开
            jinkai = data['f17']
            # 15、昨收
            zuoshou = data['f18']
            # 16、市净率
            jinshilv = data['f23']
            # 17、60日涨跌幅
            liushirezhangdiefu = str(data['f24']) + '%'
            # 18、年初至今涨跌幅
            nianchuzhijinzhangdiefu = str(data['f25']) + '%'
            # 19、总市值
            zongshizhi = data['f20']
            # 20流通市值
            liutongshizhi = data['f21']
            # 21、五分钟涨跌
            wufenzhongzhangdie = str(data['f11']) + '%'
            data = {
                f'股票数据': [self.num, name, diama, zuixingjia, diezhangfu, diezhange,
                                                  chengjiaoliang, chengjiaoe, zhengfu, huanshoulv, shiyinglv, liangbi,
                                                  zuigao, zuidi, jinkai, zuoshou, jinshilv, liushirezhangdiefu,
                                                  nianchuzhijinzhangdiefu, zongshizhi, liutongshizhi,
                                                  wufenzhongzhangdie]
            }
            gupiao_dict = {
                '序号': self.num,
                '股票名称': name,
                '股票代码': diama,
                '最新价': zuixingjia,
                '涨跌幅': diezhangfu,
                '涨跌额': diezhange,
                '成交量(手)': chengjiaoliang,
                '成交额': chengjiaoe,
                '振幅': zhengfu,
                '换手率': huanshoulv,
                '市盈率': shiyinglv,
                '量比': liangbi,
                '最高': zuigao,
                '最低': zuidi,
                '今开': jinkai,
                '昨收': zuoshou,
                '市净率': zuoshou,
                '60日涨跌幅': liushirezhangdiefu,
                '年初至今涨跌幅': nianchuzhijinzhangdiefu,
                '总市值': zongshizhi,
                '流通市值': liutongshizhi,
                '五分钟涨跌': wufenzhongzhangdie
            }
            print(gupiao_dict)
            self.chucun_excel(data)

    # 储存部分
    def chucun_excel(self, data):
        if not os.path.exists(f'股票数据.xls'):
            # 1、创建 Excel 文件
            wb = xlwt.Workbook(encoding='utf-8')
            # 2、创建新的 Sheet 表
            sheet = wb.add_sheet(f'股票数据', cell_overwrite_ok=True)
            # 3、设置 Borders边框样式
            borders = xlwt.Borders()
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top = xlwt.Borders.THIN
            borders.bottom = xlwt.Borders.THIN
            borders.left_colour = 0x40
            borders.right_colour = 0x40
            borders.top_colour = 0x40
            borders.bottom_colour = 0x40
            style = xlwt.XFStyle()  # Create Style
            style.borders = borders  # Add Borders to Style
            # 4、写入时居中设置
            align = xlwt.Alignment()
            align.horz = 0x02  # 水平居中
            align.vert = 0x01  # 垂直居中
            style.alignment = align
            # 5、设置表头信息, 遍历写入数据, 保存数据
            header = (
                '序号', '股票名称', '股票代码', '最新价', '涨跌幅', '涨跌额', '成交量(手)', '成交额', '振幅', '换手率', '市盈率', '量比', '最高', '最低', '今开',
                '昨收', '市净率', '60日涨跌幅', '年初至今涨跌幅', '总市值', '流通市值', '五分钟涨跌')
            for i in range(0, len(header)):
                sheet.col(i).width = 2560 * 3
                #           行,列, 内容,   样式
                sheet.write(0, i, header[i], style)
                wb.save(f'股票数据.xls')
        # 判断工作表是否存在
        if os.path.exists(f'股票数据.xls'):
            # 打开工作薄
            wb = xlrd.open_workbook(f'股票数据.xls')
            # 获取工作薄中所有表的个数
            sheets = wb.sheet_names()
            for i in range(len(sheets)):
                for name in data.keys():
                    worksheet = wb.sheet_by_name(sheets[i])
                    # 获取工作薄中所有表中的表名与数据名对比
                    if worksheet.name == name:
                        # 获取表中已存在的行数
                        rows_old = worksheet.nrows
                        # 将xlrd对象拷贝转化为xlwt对象
                        new_workbook = copy(wb)
                        # 获取转化后的工作薄中的第i张表
                        new_worksheet = new_workbook.get_sheet(i)
                        for num in range(0, len(data[name])):
                            new_worksheet.write(rows_old, num, data[name][num])
                        new_workbook.save(f'股票数据.xls')
        xai_data = f'已经存储第{self.num}条股票数据至《股票数据》'
        print(xai_data)


if __name__ == '__main__':
    g=GuPiao()
    g.spider()

五、数据可视化

1.将股票60日涨跌情况进行汇总并绘制成折线图和柱状图,

通过这两图可以帮助投资者了解股票的长期趋势和表现。

股票60日涨跌幅折现图

股票60日涨跌幅柱状图

 

数据视图

代码实现

import pandas as pd
from pyecharts.charts import Line
from pyecharts import options as opts

def shujufenxi():
    # =============== 60 日 涨 跌 幅 ========================
    # 读取数据
    file_path = f'股票数据.xls'  # 替换为您的文件路径
    df = pd.read_excel(file_path)
    stock_names = df['股票名称'].tolist()  # 股票名称
    latest_prices = df['60日涨跌幅'].tolist()  # 60日涨跌幅
    # 将百分比的字符串转换为浮点数
    latest_prices = [float(x.strip('%')) for x in latest_prices]
    # 创建高级折线图
    line_chart1 = Line(init_opts=opts.InitOpts(theme='infographic', bg_color='#e7e5d0'))
    line_chart1.add_xaxis(stock_names)
    line_chart1.add_yaxis("60日涨跌幅", latest_prices, label_opts=opts.LabelOpts(position="top"))
    line_chart1.set_global_opts(
        title_opts=opts.TitleOpts(title="股票60日涨跌幅折线图"),
        toolbox_opts=opts.ToolboxOpts(),
        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
        yaxis_opts=opts.AxisOpts(name="60日涨跌幅"),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
        datazoom_opts=[
            opts.DataZoomOpts(type_="slider", is_show=True),
            opts.DataZoomOpts(type_="inside", is_show=True),
        ],
    )

    # 设置系列选项,添加最大值、最小值、平均值标记
    line_chart1.set_series_opts(
        marker_opts=opts.MarkPointOpts(
            data=[
                opts.MarkPointItem(type_="max", name="最大值"),
                opts.MarkPointItem(type_="min", name="最小值"),
                opts.MarkPointItem(type_="average", name="平均值")
            ]
        )
    )
    html_content_1 = line_chart1.render_embed()

2.将股票五分钟涨跌情况进行汇总并绘制成折现图和柱状图,

通过这两图能够及时地反映股票市场的动态,帮助投资者了解市场走势和个股表现。

股票五分钟涨跌幅折线图

股票五分钟涨跌柱状图

 

数据视图

代码实现

    # ==================五分钟涨跌=================================
    # 读取数据
    file_path = f'股票数据.xls'  # 替换为您的文件路径
    df = pd.read_excel(file_path)
    stock_names = df['股票名称'].tolist()  # 股票名称
    latest_prices = df['五分钟涨跌'].tolist()  # 五分钟涨跌
    latest_prices = [float(x.strip('%')) for x in latest_prices]
    line_chart2 = Line(init_opts=opts.InitOpts(theme='dark'))
    line_chart2.add_xaxis(stock_names)
    line_chart2.add_yaxis("五分钟涨跌", latest_prices, label_opts=opts.LabelOpts(position="top"))
    line_chart2.set_global_opts(
        title_opts=opts.TitleOpts(title="股票五分钟涨跌折线图"),
        toolbox_opts=opts.ToolboxOpts(),
        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
        yaxis_opts=opts.AxisOpts(name="五分钟涨跌"),
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
        datazoom_opts=[
            opts.DataZoomOpts(type_="slider", is_show=True),
            opts.DataZoomOpts(type_="inside", is_show=True),
        ],
    )
    line_chart2.set_series_opts(
        marker_opts=opts.MarkPointOpts(
            data=[
                opts.MarkPointItem(type_="max", name="最大值"),
                opts.MarkPointItem(type_="min", name="最小值"),
                opts.MarkPointItem(type_="average", name="平均值")
            ]
        )
    )

六、总结

1.使用request对东方股票股价、成交量、市盈率等指标进行爬取。

2.对爬取的数据进行数据清洗。

3.爬取的数据保存到xls文件中,便于后续分析。

4.设计股票60日涨跌幅折线图它可以帮助投资者了解股票的长期趋势和表现。

5.设计股票5分钟涨跌幅折线图它能够捕捉到更短期的市场动态,帮助投资者更好地了解股票的短期走势。

通过这次课程设计,我们不仅掌握了Python爬虫和数据可视化的基本技能,还对股票市场有了更深入的了解。同时,我们也认识到在实际应用中,需要关注数据的质量和准确性。在未来,我们希望进一步探索股票市场的规律和趋势,为投资决策提供更有价值的信息。

完整源代码如下:

  1 import json
  2 import requests, time
  3 from tkinter import *
  4 import xlrd, xlwt, os
  5 from xlutils.copy import copy
  6 
  7 class GuPiao():
  8     def __init__(self):
  9         self.num = 0
 10 
 11     # 爬虫部分
 12     def spider(self):
 13         for page in range(1,21):   #这个地方可以页数增加数据
 14             start_url = 'https://83.push2.eastmoney.com/api/qt/clist/get'
 15             headers = { 
 16                 'Accept': '*/*',
 17                 'Accept-Language': 'zh-CN,zh;q=0.9',
 18                 'Cache-Control': 'no-cache',
 19                 'Connection': 'keep-alive',
 20                 # Requests sorts cookies= alphabetically
 21                 # 'Cookie': 'qgqp_b_id=ffb939776279b0bdd1f6e61281c3c294; st_si=89921490520325; websitepoptg_api_time=1700894106860; websitepoptg_show_time=1700894107214; HAList=ty-1-600789-%u9C81%u6297%u533B%u836F%2Cty-1-600519-%u8D35%u5DDE%u8305%u53F0%2Cty-0-000858-%u4E94%20%u7CAE%20%u6DB2%2Cty-0-002456-%u6B27%u83F2%u5149; st_asi=delete; st_pvi=61091067222435; st_sp=2023-11-03%2018%3A10%3A35; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=5; st_psi=20231125143800994-113200301321-8038820015',
 22                 'Pragma': 'no-cache',
 23                 'Referer': 'https://quote.eastmoney.com/center/gridlist.html',
 24                 'Sec-Fetch-Dest': 'script',
 25                 'Sec-Fetch-Mode': 'no-cors',
 26                 'Sec-Fetch-Site': 'same-site',
 27                 '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',
 28                 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
 29                 'sec-ch-ua-mobile': '?0',
 30                 'sec-ch-ua-platform': '"Windows"',
 31             }
 32             fomdata = {
 33                 'cb': 'jQuery1124001114974346054809_1700894280689',
 34                 'pn': page,
 35                 'pz': '20',
 36                 'po': '1',
 37                 'np': '1',
 38                 'ut': 'bd1d9ddb04089700cf9c27f6f7426281',
 39                 'fltt': '2',
 40                 'invt': '2',
 41                 'wbp2u': '|0|0|0|web',
 42                 'fid': 'f3',
 43                 'fs': 'm:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048',
 44                 'fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152',
 45                 '_': '1700894280699'
 46             }
 47             response = requests.get(url=start_url, headers=headers, params=fomdata).text
 48             response = re.findall('jQuery1124001114974346054809_1700894280689\((.*?)\);', response)[0]
 49             response = json.loads(response)
 50             datas = response['data']['diff']
 51             time.sleep(2)
 52             self.parase_data(datas)
 53 
 54     # 解析部分
 55     def parase_data(self, datas):
 56         for data in datas:
 57             # 0、序号
 58             self.num += 1
 59             # 1、最新价
 60             zuixingjia = data['f2']
 61             # 2、涨跌幅
 62             diezhangfu = str(data['f3']) + '%'
 63             # 3、涨跌额
 64             diezhange = data['f4']
 65             # 4、成交量(手)
 66             chengjiaoliang = data['f5']
 67             # 5、成交额
 68             chengjiaoe = data['f6']
 69             # 6、振幅
 70             zhengfu = str(data['f7']) + '%'
 71             # 7、换手率
 72             huanshoulv = str(data['f8']) + '%'
 73             # 8、市盈率
 74             shiyinglv = data['f9']
 75             # 9、量比
 76             liangbi = data['f10']
 77             # 10、股票代码
 78             diama = data['f12']
 79             # 11、股票名称
 80             name = data['f14']
 81             # 12、最高
 82             zuigao = data['f15']
 83             # 13、最低
 84             zuidi = data['f16']
 85             # 14、今开
 86             jinkai = data['f17']
 87             # 15、昨收
 88             zuoshou = data['f18']
 89             # 16、市净率
 90             jinshilv = data['f23']
 91             # 17、60日涨跌幅
 92             liushirezhangdiefu = str(data['f24']) + '%'
 93             # 18、年初至今涨跌幅
 94             nianchuzhijinzhangdiefu = str(data['f25']) + '%'
 95             # 19、总市值
 96             zongshizhi = data['f20']
 97             # 20流通市值
 98             liutongshizhi = data['f21']
 99             # 21、五分钟涨跌
100             wufenzhongzhangdie = str(data['f11']) + '%'
101             data = {
102                 f'股票数据': [self.num, name, diama, zuixingjia, diezhangfu, diezhange,
103                                                   chengjiaoliang, chengjiaoe, zhengfu, huanshoulv, shiyinglv, liangbi,
104                                                   zuigao, zuidi, jinkai, zuoshou, jinshilv, liushirezhangdiefu,
105                                                   nianchuzhijinzhangdiefu, zongshizhi, liutongshizhi,
106                                                   wufenzhongzhangdie]
107             }
108             gupiao_dict = {
109                 '序号': self.num,
110                 '股票名称': name,
111                 '股票代码': diama,
112                 '最新价': zuixingjia,
113                 '涨跌幅': diezhangfu,
114                 '涨跌额': diezhange,
115                 '成交量(手)': chengjiaoliang,
116                 '成交额': chengjiaoe,
117                 '振幅': zhengfu,
118                 '换手率': huanshoulv,
119                 '市盈率': shiyinglv,
120                 '量比': liangbi,
121                 '最高': zuigao,
122                 '最低': zuidi,
123                 '今开': jinkai,
124                 '昨收': zuoshou,
125                 '市净率': zuoshou,
126                 '60日涨跌幅': liushirezhangdiefu,
127                 '年初至今涨跌幅': nianchuzhijinzhangdiefu,
128                 '总市值': zongshizhi,
129                 '流通市值': liutongshizhi,
130                 '五分钟涨跌': wufenzhongzhangdie
131             }
132             print(gupiao_dict)
133             self.chucun_excel(data)
134 
135 
136     # 储存部分
137     def chucun_excel(self, data):
138         if not os.path.exists(f'股票数据.xls'):
139             # 1、创建 Excel 文件
140             wb = xlwt.Workbook(encoding='utf-8')
141             # 2、创建新的 Sheet 表
142             sheet = wb.add_sheet(f'股票数据', cell_overwrite_ok=True)
143             # 3、设置 Borders边框样式
144             borders = xlwt.Borders()
145             borders.left = xlwt.Borders.THIN
146             borders.right = xlwt.Borders.THIN
147             borders.top = xlwt.Borders.THIN
148             borders.bottom = xlwt.Borders.THIN
149             borders.left_colour = 0x40
150             borders.right_colour = 0x40
151             borders.top_colour = 0x40
152             borders.bottom_colour = 0x40
153             style = xlwt.XFStyle()  # Create Style
154             style.borders = borders  # Add Borders to Style
155             # 4、写入时居中设置
156             align = xlwt.Alignment()
157             align.horz = 0x02  # 水平居中
158             align.vert = 0x01  # 垂直居中
159             style.alignment = align
160             # 5、设置表头信息, 遍历写入数据, 保存数据
161             header = (
162                 '序号', '股票名称', '股票代码', '最新价', '涨跌幅', '涨跌额', '成交量(手)', '成交额', '振幅', '换手率', '市盈率', '量比', '最高', '最低', '今开',
163                 '昨收', '市净率', '60日涨跌幅', '年初至今涨跌幅', '总市值', '流通市值', '五分钟涨跌')
164             for i in range(0, len(header)):
165                 sheet.col(i).width = 2560 * 3
166                 #           行,列, 内容,   样式
167                 sheet.write(0, i, header[i], style)
168                 wb.save(f'股票数据.xls')
169         # 判断工作表是否存在
170         if os.path.exists(f'股票数据.xls'):
171             # 打开工作薄
172             wb = xlrd.open_workbook(f'股票数据.xls')
173             # 获取工作薄中所有表的个数
174             sheets = wb.sheet_names()
175             for i in range(len(sheets)):
176                 for name in data.keys():
177                     worksheet = wb.sheet_by_name(sheets[i])
178                     # 获取工作薄中所有表中的表名与数据名对比
179                     if worksheet.name == name:
180                         # 获取表中已存在的行数
181                         rows_old = worksheet.nrows
182                         # 将xlrd对象拷贝转化为xlwt对象
183                         new_workbook = copy(wb)
184                         # 获取转化后的工作薄中的第i张表
185                         new_worksheet = new_workbook.get_sheet(i)
186                         for num in range(0, len(data[name])):
187                             new_worksheet.write(rows_old, num, data[name][num])
188                         new_workbook.save(f'股票数据.xls')
189         xai_data = f'已经存储第{self.num}条股票数据至《股票数据》'
190         print(xai_data)
191 
192 
193 if __name__ == '__main__':
194     g=GuPiao()
195     g.spider()
196 
197 
198 import pandas as pd
199 from pyecharts.charts import Line
200 from pyecharts import options as opts
201 
202 
203 def shujufenxi():
204     # =============== 60 日 涨 跌 幅 ========================
205     # 读取数据
206     file_path = f'股票数据.xls'  # 替换为您的文件路径
207     df = pd.read_excel(file_path)
208     stock_names = df['股票名称'].tolist()  # 股票名称
209     latest_prices = df['60日涨跌幅'].tolist()  # 60日涨跌幅
210     # 将百分比的字符串转换为浮点数
211     latest_prices = [float(x.strip('%')) for x in latest_prices]
212     # 创建高级折线图
213     line_chart1 = Line(init_opts=opts.InitOpts(theme='infographic', bg_color='#e7e5d0'))
214     line_chart1.add_xaxis(stock_names)
215     line_chart1.add_yaxis("60日涨跌幅", latest_prices, label_opts=opts.LabelOpts(position="top"))
216     line_chart1.set_global_opts(
217         title_opts=opts.TitleOpts(title="股票60日涨跌幅折线图"),
218         toolbox_opts=opts.ToolboxOpts(),
219         tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
220         yaxis_opts=opts.AxisOpts(name="60日涨跌幅"),
221         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
222         datazoom_opts=[
223             opts.DataZoomOpts(type_="slider", is_show=True),
224             opts.DataZoomOpts(type_="inside", is_show=True),
225         ],
226     )
227 
228     # 设置系列选项,添加最大值、最小值、平均值标记
229     line_chart1.set_series_opts(
230         marker_opts=opts.MarkPointOpts(
231             data=[
232                 opts.MarkPointItem(type_="max", name="最大值"),
233                 opts.MarkPointItem(type_="min", name="最小值"),
234                 opts.MarkPointItem(type_="average", name="平均值")
235             ]
236         )
237     )
238     html_content_1 = line_chart1.render_embed()
239 
240 
241     # ==================五分钟涨跌=================================
242     # 读取数据
243     file_path = f'股票数据.xls'  # 替换为您的文件路径
244     df = pd.read_excel(file_path)
245     stock_names = df['股票名称'].tolist()  # 股票名称
246     latest_prices = df['五分钟涨跌'].tolist()  # 五分钟涨跌
247     latest_prices = [float(x.strip('%')) for x in latest_prices]
248     line_chart2 = Line(init_opts=opts.InitOpts(theme='dark'))
249     line_chart2.add_xaxis(stock_names)
250     line_chart2.add_yaxis("五分钟涨跌", latest_prices, label_opts=opts.LabelOpts(position="top"))
251     line_chart2.set_global_opts(
252         title_opts=opts.TitleOpts(title="股票五分钟涨跌折线图"),
253         toolbox_opts=opts.ToolboxOpts(),
254         tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
255         yaxis_opts=opts.AxisOpts(name="五分钟涨跌"),
256         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
257         datazoom_opts=[
258             opts.DataZoomOpts(type_="slider", is_show=True),
259             opts.DataZoomOpts(type_="inside", is_show=True),
260         ],
261     )
262     line_chart2.set_series_opts(
263         marker_opts=opts.MarkPointOpts(
264             data=[
265                 opts.MarkPointItem(type_="max", name="最大值"),
266                 opts.MarkPointItem(type_="min", name="最小值"),
267                 opts.MarkPointItem(type_="average", name="平均值")
268             ]
269         )
270     )
271     # 渲染图表
272 
273     html_content_2 = line_chart2.render_embed()
274     # 创建最终的 HTML 页面
275 
276     complete_html = f"""
277                     <html>
278                     <head>
279                         <title>股票数据可视化</title>
280                     </head>
281                     <body style="background: linear-gradient(to right, #e5b8c3, #c17886);"> 
282                     <h1 style="text-align: center;margin-top: 20px;">股 票 数 据 可 视 化</h1>
283                         <div class="one" style="display: flex; justify-content: center; flex-wrap: wrap; height: 100%;">
284                             <div style="margin: 10px; padding: 10px;">
285                                 <h3 style="text-align: center;margin-top: 20px;">60日涨跌幅</h3>
286                                 {html_content_1}
287                             </div>
288                             <div style="margin: 10px; padding: 10px;">
289                                 <h1 style="text-align: center;margin-top: 20px;">五分钟涨跌</h1>
290                                 {html_content_2}
291                             </div>
292                         </div>
293 
294                     </body>
295                     </html>
296                     
297     # 保存整合后的 HTML 文件
298 
299     with open(f'60日涨跌幅和5分钟涨跌可视化.html', "w", encoding="utf-8") as file:
300         file.write(complete_html)
301         xai_data = f'已生成股票《60日涨跌幅和5分钟涨跌》可视化.html'
302         print(xai_data)
303 shujufenxi()

 

posted @ 2023-12-28 22:26  肖孟东  阅读(531)  评论(0)    收藏  举报