- 任务要求
- 爬取财富榜top300数据
- 创建数据库,并将top300数据存入数据库
- 创建表格,并将top300数据存入表格
- 将top300数据取前50进行柱状图展示(使用html)
- 将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")