赞
踩
爬虫-可视化界面柱状图
交作业啦,最近在学习爬虫,由于基础性学习太慢,对于我这种急性子的人直接去 B站找了一个完整的例子直接上手做了。
就是爬取一个页面的内容,并把爬取下来的数据可视化,用柱状图直观表示出来。
直接上代码吧
import requests import pprint import csv file = open('data.csv', mode='a', encoding='utf-8', newline='') #a表示数据的追加 csv_write = csv.DictWriter(file,fieldnames=['股票代码','股票名称','当前价','涨跌额','涨幅额','年初至今','成交量','成交额','换手率','市盈率','股息率','市值']) csv_write.writeheader()#写入一次表头数据 for page in range(1,53): print('----------正在抓取第{}页数据----------------------'.format(page)) #1.确定url地址(链接地址)<分析网页性质> url='https://xueqiu.com/service/v5/stock/screener/quote/list?page={}&size=30&order=desc&order_by=amount&exchange=CN&market=CN&type=sha&_=1627646170409'.format(str(page)) headers={ } #2.发送网络请求 response=requests.get(url=url,headers=headers) print(response) json_data=response.json() #pprint.pprint(json_data) #3.数据解析1(筛选数据) data_list=json_data['data']['list'] for data in data_list: #print(data) data1 = data['symbol'] data2 = data['name'] data3 = data['current'] data4 = data['chg'] if data4: if float(data4) > 0: data4='+'+str(data4) else: data4=str(data4) data5 = str(data['percent'])+'%' data6 = str(data['current_year_percent']) + '%' data7 = data['volume'] data8 = data['amount'] data9 = str(data['turnover_rate'])+ '%' data10= data['pb_ttm'] data11 = data['dividend_yield'] if data11: data11=str (data['dividend_yield'])+ '%' else: data11=None data12 = data['market_capital'] print(data1,data2,data3,data4,data5,data6,data7,data8,data9,data10,data11,data12) #4.保存数据 data_dict={'股票代码':data1,'股票名称':data2,'当前价':data3,'涨跌额':data4,'涨幅额':data5,'年初至今':data6,'成交量':data7,'成交额':data8,'换手率':data9,'市盈率':data10,'股息率':data11,'市值':data12} csv_write.writerow(data_dict)
从页面爬下数据之后,开始可视化处理
import pandas as pd from pyecharts import options as opts from pyecharts.charts import Bar import matplotlib.pyplot as plt import matplotlib.ticker as ticker data_df = pd.read_csv('data.csv') df = data_df.dropna()#过滤缺失数据 ''' DataFrme.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False) 参数: axis: 默认axis=0。0为按行删除,1为按列删除 how: 默认 ‘any’。 ‘any’指带缺失值的所有行/列;'all’指清除一整行/列都是缺失值的行/列 thresh: int,保留含有int个非nan值的行 subset: 删除特定列中包含缺失值的行或列 inplace: 默认False,即筛选后的数据存为副本,True表示直接在原数据上更改 ''' df1 = df[['股票名称','成交量']] df2 = df1.iloc[:20]#iloc函数:通过行号来取行数据 print(df2['股票名称'].values) print(df2['成交量'].values) c = ( Bar(init_opts=opts.InitOpts(width="1500px", height="700px")) .add_xaxis(list(df2['股票名称'].values)) .add_yaxis("股票成交情况",list(df2['成交量'].values)) .set_global_opts( title_opts=opts.TitleOpts(title="成交量图表-Volume chart"), datazoom_opts=opts.DataZoomOpts(), ) .render("data.html") )
这其中遇到的问题是由与柱状图当初没有设置图表画布宽度,使用默认值,最初显示的柱状图x轴并没有把每个点对应的是什么显示出来。
class InitOpts( # 图表画布宽度,css 长度单位。 width: str = "900px", # 图表画布高度,css 长度单位。 height: str = "500px", # 图表 ID,图表唯一标识,用于在多图表时区分。 chart_id: Optional[str] = None, # 渲染风格,可选 "canvas", "svg" # # 参考 `全局变量` 章节 renderer: str = RenderType.CANVAS, # 网页标题 page_title: str = "Awesome-pyecharts", # 图表主题 theme: str = "white", # 图表背景颜色 bg_color: Optional[str] = None, # 远程 js host,如不设置默认为 https://assets.pyecharts.org/assets/" # 参考 `全局变量` 章节 js_host: str = "", # 画图动画初始化配置,参考 `global_options.AnimationOpts` animation_opts: Union[AnimationOpts, dict] = AnimationOpts(), ) Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC,width="1200px",height="300px",chart_id='efg123',renderer='RenderType.SVG'))
''' def add_yaxis( # 系列名称,用于 tooltip 的显示,legend 的图例筛选。 series_name: str, # 系列数据 y_axis: Sequence[Numeric, opts.BarItem, dict], # 是否选中图例 is_selected: bool = True, # 使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。 xaxis_index: Optional[Numeric] = None, # 使用的 y 轴的 index,在单个图表实例中存在多个 y 轴的时候有用。 yaxis_index: Optional[Numeric] = None, # 是否启用图例 hover 时的联动高亮 is_legend_hover_link: bool = True, # 系列 label 颜色 color: Optional[str] = None, # 是否显示柱条的背景色。通过 backgroundStyle 配置背景样式。 is_show_background: bool = False, # 每一个柱条的背景样式。需要将 showBackground 设置为 true 时才有效。 background_style: types.Union[types.BarBackground, dict, None] = None, # 数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置。 stack: Optional[str] = None, # 柱条的宽度,不设时自适应。 # 可以是绝对值例如 40 或者百分数例如 '60%'。百分数基于自动计算出的每一类目的宽度。 # 在同一坐标系上,此属性会被多个 'bar' 系列共享。此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效,并且是对此坐标系中所有 'bar' 系列生效。 bar_width: types.Union[types.Numeric, str] = None, # 柱条的最大宽度。比 barWidth 优先级高。 bar_max_width: types.Union[types.Numeric, str] = None, # 柱条的最小宽度。在直角坐标系中,默认值是 1。否则默认值是 null。比 barWidth 优先级高。 bar_min_width: types.Union[types.Numeric, str] = None, # 柱条最小高度,可用于防止某数据项的值过小而影响交互。 bar_min_height: types.Numeric = 0, # 同一系列的柱间距离,默认为类目间距的 20%,可设固定值 category_gap: Union[Numeric, str] = "20%", # 不同系列的柱间距离,为百分比(如 '30%',表示柱子宽度的 30%)。 # 如果想要两个系列的柱子重叠,可以设置 gap 为 '-100%'。这在用柱子做背景的时候有用。 gap: Optional[str] = "30%", # 是否开启大数据量优化,在数据图形特别多而出现卡顿时候可以开启。 # 开启后配合 largeThreshold 在数据量大于指定阈值的时候对绘制进行优化。 # 缺点:优化后不能自定义设置单个数据项的样式。 is_large: bool = False, # 开启绘制优化的阈值。 large_threshold: types.Numeric = 400, # 使用 dimensions 定义 series.data 或者 dataset.source 的每个维度的信息。 # 注意:如果使用了 dataset,那么可以在 dataset.source 的第一行/列中给出 dimension 名称。 # 于是就不用在这里指定 dimension。 # 但是,如果在这里指定了 dimensions,那么 ECharts 不再会自动从 dataset.source 的第一行/列中获取维度信息。 dimensions: types.Union[types.Sequence, None] = None, # 当使用 dataset 时,seriesLayoutBy 指定了 dataset 中用行还是列对应到系列上,也就是说,系列“排布”到 dataset 的行还是列上。可取值: # 'column':默认,dataset 的列对应于系列,从而 dataset 中每一列是一个维度(dimension)。 # 'row':dataset 的行对应于系列,从而 dataset 中每一行是一个维度(dimension)。 series_layout_by: str = "column", # 如果 series.data 没有指定,并且 dataset 存在,那么就会使用 dataset。 # datasetIndex 指定本系列使用那个 dataset。 dataset_index: types.Numeric = 0, # 是否裁剪超出坐标系部分的图形。柱状图:裁掉所有超出坐标系的部分,但是依然保留柱子的宽度 is_clip: bool = True, # 柱状图所有图形的 zlevel 值。 z_level: types.Numeric = 0, # 柱状图组件的所有图形的z值。控制图形的前后顺序。 # z值小的图形会被z值大的图形覆盖。 # z相比zlevel优先级更低,而且不会创建新的 Canvas。 z: types.Numeric = 2, # 标签配置项,参考 `series_options.LabelOpts` label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(), # 标记点配置项,参考 `series_options.MarkPointOpts` markpoint_opts: Union[opts.MarkPointOpts, dict, None] = None, # 标记线配置项,参考 `series_options.MarkLineOpts` markline_opts: Union[opts.MarkLineOpts, dict, None] = None, # 提示框组件配置项,参考 `series_options.TooltipOpts` tooltip_opts: Union[opts.TooltipOpts, dict, None] = None, # 图元样式配置项,参考 `series_options.ItemStyleOpts` itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None, # 可以定义 data 的哪个维度被编码成什么。 encode: types.Union[types.JSFunc, dict, None] = None, ) '''
最后成果
参考资料:[1]https://blog.csdn.net/weixin_47723732/article/details/113860234
[2]https://blog.csdn.net/zhaoyangjian724/article/details/103402191
[3]https://www.bilibili.com/video/BV1vt4y1v7oJfrom=search&seid=5714856360443427054
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。