Python可视化

  • 任务要求
  1. 爬取财富榜top300数据
  2. 创建数据库,并将top300数据存入数据库
  3. 创建表格,并将top300数据存入表格
  4. 将top300数据取前50进行柱状图展示(使用html)
  5. 将top300数据按照2500,2000,1500,1000,500,100范围用饼图展示(使用html)
  • 各项任务效果及代码分析

1.爬取财富榜top300数据

思路:gethtml函数获取财富榜的html信息,其中遍历i从1到15,并转化为string类型表示在url中,对得到的html转化为文本一次性存入html1中,并将html1作为函数返回结果。

required_compile(str)函数为对得到的html1结果进行正则表达式的操作,调用的deal()函数为处理函数(去除空格,无效信息等)。
required_data()函数为返回需要信息的列表,在其中调用required_compile(str)函数并将正则表达式作为参数传入,如,需要name和money调用函数得到两个列表,再将两个列表合并为一个二维列表,并返回。

    只需要调用required_data()函数即可得到信息,代码复用性,可修改性强。结果图:

2.将结果存入数据库

       

思路:使用sqlite创建test.db数据库,创建fuhao表。将required_data作为参数传入savadatabase函数,二维列表插入可用{0},{1}通配符,使用item去遍历required_data,在执行时,将sql.format(*item)格式化就可实现二维列表的sql插入。

结果图:

3. 创建表格,并将top300数据存入表格

思路:创建workbook对象,再创建worksheet工作表先设置列名col,再将require_data遍历存入表中,i循环为获取二维列表中的每一个列表,j循环为获取一维列表中的name和money信息。并将结果保存在D盘下,

结果图:

4. 将top300数据取前50进行柱状图展示(使用html)

思路:对required_data遍历前50名,使用peycharts模块from pyecharts.charts import  Bar,创建bar对象,为bar添加x轴信息和y轴信息,并保留结果为柱状图。

     结果图:

5. 将top300数据按照2500,2000,1500,1000,500,100范围用饼图展示(使用html)

 

思路:创建两个列表一个为colum用于分类,data数据全为零,用于对colum列表中的信息进行统计。使用for循环分别对required_deta进行遍历,对其中界限进行判断,并在data中进行统计,需要注意的是required_deta数据中的类型为str型,需要进行int类型转化再进行判断,data_pair1用于将两个colum列表和data列表进行映射结果的保存,在pie中添加data_pair1作为饼图的参数,将结果保存为饼图.html。

结果图;

  • 代码总览

import re
from pyecharts.charts import  Pie
import matplotlib.pyplot as plt
# 导入折线图
from pyecharts.charts import  Bar
#导入设置系统配置和全局配置
from pyecharts import options as opts
import urllib.request

import sqlite3
import xlwt
def deal(list):
   list=replacebilank(list)
   list =replacestr(list)
   return list
def replacebilank(list):#去空格
    New_list = []
    for i in list:
        New_list.append(i.replace(" ", ""))
    return New_list
def replacestr(list):#去无效字符
    New_list = []
    for i in list:
        New_list.append(i.replace(" ", ""))
    return New_list
def gethtml():#获取html
    html1=""
    for i in range(1,16):

            url="https://www.phb123.com/renwu/fuhao/shishi_"+str(i)+".html"
            headers={
                 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                              "AppleWebKit/537.36 (KHTML, like Gecko) "
                              "Chrome/99.0.4844.84 Safari/537.36"
            }
            req=urllib.request.Request(url=url,headers=headers)
            response=urllib.request.urlopen(req)
            html=response.read().decode("utf-8")
            str(html)
            html1=html1+str(html)
    return html1
# print(gethtml());
def required_compile(str):#返回正则表达式内容
    html = gethtml()
    listgaint=[]
    p4 = re.compile(str)
    for four in p4.findall(html):
        listgaint.append(four)
    listgaint = deal(listgaint)
    return listgaint
def required_deta():#返回需求集合

    # listname=required_compile(r'alt="(.*?)" src="')
    # listjpg=required_compile(r'src="(.*?)" class=')
    # listreword=required_compile(r'class="other"> / (.*?)<')
    # listgaint=required_compile(r'    (.*)...<br>')
    listname = required_compile(r'alt="(.*?)" width')
    listmoney = required_compile(r'<td>(.*?)亿美元</td>')
    required_details = []
    for i in range(len(listname)):  # 将获得的信息存储在required_details = []
        required_details.append([listname[i],listmoney[i]])
    return required_details
required_deta=required_deta()
print(required_deta)
def savedatabase(required_deta):
    conn = sqlite3.connect('test.db')
    cursor = conn.cursor()
    sql="insert into fuhao (name1,money) VALUES('{0}','{1}')";
    for item in required_deta:
        cursor.execute(sql.format(*item))
    cursor.close()
    conn.commit()
    conn.close()
# savedatabase(required_deta)
#保存数据
def saveData(required_deta):
    data=[]
    workbook = xlwt.Workbook(encoding='utf-8',style_compression=0)  # 创建work book对象
    worksheet = workbook.add_sheet('sheet1',cell_overwrite_ok=True)  # 创建工作表
    col=("名字","金钱",)
    for i in range(0,2):
        worksheet.write(0,i,col[i])#列名
    for i in range(0, 300):
        data = required_deta[i]
        for j in range(0, 2):
            worksheet.write(i+1, j, data[j])
    workbook.save('D:\\fuhao.xls')  # 保存数据表
# saveData(required_deta)
# #对数据处理并绘图柱状图
data = []
name = []
for i in range(50):
    name.append(required_deta[i][0])
    data.append(required_deta[i][1])
bar = Bar()
print(data)
print(name)
# 横坐标
bar.add_xaxis(name)
# 纵坐标
bar.add_yaxis("亿/美元", data)
# 设置折线图标题和副标题
bar.set_global_opts(title_opts=opts.TitleOpts(title="柱状图", subtitle="财富榜"))
# 图形输出的文件名
bar.render("柱状图.html")

#绘制饼图
data = [0,0,0,0,0,0,0]
colums = ['大于2500','2500到2000','2000到1500','1500到1000','1000到500','500到100','100以下']
for i in range(300):
    if int(required_deta[i][1])>2500:
        data[0]=data[0]+1
    elif int(required_deta[i][1])>2000:
        data[1] =data[1]+1
    elif int(required_deta[i][1])>1500:
        data[2] =data[2]+1
    elif int(required_deta[i][1])>1000:
        data[3] =data[3]+1
    elif int(required_deta[i][1])>500:
        data[4] =data[4]+1
    elif int(required_deta[i][1])>100:
        data[5]=data[5]+1
    else:data[6]=data[6]+1
print(data)
data_pair1=[list(z) for z in zip(colums,data)]
pie=Pie(init_opts=opts.InitOpts(bg_color="#2c343c"))
pie.add(
    #系列名称,即该饼图的名称
    series_name="财富榜",
    #系列数据项,格式为[(key1,value1),(key2,value2)]
    data_pair=data_pair1,
    #通过半径区分数据大小“radius”和“area”两种
    rosetype="radius",
    #饼图的半径,设置成默认百分比,相对于容器高度中较小的一项的一半
    radius="50%",
    center=["50%","50%"],
    #标签配置项
    label_opts=opts.LabelOpts(is_show=False,position="center"),

)
pie.set_global_opts(
    #设置标题
    title_opts=opts.TitleOpts(title="财富榜比例",#标题
                              pos_left="center",#组件距离容器左侧的位置
                              pos_top="20",#组件距离容器上方的像素值
                              #设置标题颜色
                              title_textstyle_opts=opts.TextStyleOpts(color="#fff"),),
    #图例配置项,参数是否显示图中组件
    legend_opts=opts.LegendOpts(is_show=False),

)
#系列设置
pie.set_series_opts(
    tooltip_opts=opts.TooltipOpts(trigger="item",formatter="{a}<br/>{b}:{c}({d}%)"),
    #设置标签的颜色
    label_opts=opts.LabelOpts(color="rgba(255,255,255,0.3)"),
)
pie.render("饼图.html")

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值