diff --git a/小组作业.py b/小组作业.py new file mode 100644 index 0000000..0c79388 --- /dev/null +++ b/小组作业.py @@ -0,0 +1,107 @@ +import requests#获取页面数据 +from bs4 import BeautifulSoup#解析页面 +import re#正则表达模块,匹配过程:1.依次拿出表达式和文本中的字符比较,2,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。 +import wordcloud +import numpy as np#Python的一种开源的数值计算扩展 +import pandas as pd #用于数据清洗 +import matplotlib #绘图库 +import matplotlib.pyplot as plt#是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API +import matplotlib.mlab as mlab# 这个包中的函数可以添加随机变量分布的拟合曲线 +import xlwt +from pyecharts.charts import Bar,Grid +from pyecharts import options as opts + +def getHtmlText(url): + try: + + #模拟浏览器 + kv = {'user-agent':'Mozilla/5.0 '}#重新定义user-agent的内容,使其等于Mozilla/5.0,将其伪装成一个浏览器 + html = page_text = requests.get(url=url, headers=kv)#获取页面内容 + html.encoding = 'utf-8' #设置页面编码格式为utf-8防止获取到的是乱码 + htmlText = html.text + # print(htmlText) + return htmlText + except:#如果获取不成功或者编码无法解析 + print("获取页面数据失败") + +#使用BeautifulSoup进行页面解析 +def yemianjiexi(html_text): + soup = BeautifulSoup(html_text, 'html.parser')#对html_text进行解析,使用了html格式的parser解析器 + return soup + +#对爬取内容进行定位 +def Title(): #获取标题并进行存储 + tit = [] #创建列表进行存储 + title = yemianjiexi(getHtmlText(url)).select('.info > a')#使用select筛选元素,获取标题 + for ti in title: + tit.append(ti.text)#将标题加入列表 + return tit + #获取播放量并进行存储 +def getBf(): + bofang = [] #创建列表进行存储 + bf = yemianjiexi(getHtmlText(url)).select('.detail-state > span:nth-of-type(1)')#使用select筛选元素,获得播放量 + for b in bf: + bof = re.findall(r'\d+\.\d+|\d+', b.text)#播放量用1个'.'号作为分隔符,分割3个数字 + bofang.append('%.2f' % (float(bof[0])/10))#将播放量存入列表中,播放量以十万为单位 + return bofang + +#获取弹幕并进行存储 +def danmu(): + danmus = [] #创建存储弹幕数 + danmu = yemianjiexi(getHtmlText(url)).select('.detail-state > span:nth-of-type(2)') + for d in danmu: + bof = re.findall('\d+\.\d+|\d+',d.text)#弹幕数用一个'.'号作为分隔符,分割三个数字 + if float(bof[0]) < 10:#弹幕以千为单位 + bof[0] = '%.2f' % (float(bof[0]) * 10) + else: + bof[0] = '%.2f' % (float(bof[0])/1000) + danmus.append(bof[0])#将弹幕数存入列表中 + return danmus + +if __name__ == '__main__': + url = 'https://www.bilibili.com/v/popular/rank/all'#排行榜地址 + yemianjiexi(getHtmlText(url)) + Title() #获取标题 + getBf() #获取播放量 + danmu() #获取弹幕量 + datas = [] #存储标题和播放量和弹幕数 + print("{:^30}\t\t{:^40}\t\t{:^50}".format( '标题', '播放量/十万','弹幕数/k'))#输出顶端标题 + for i in range(15):#遍历排名前15的视频 + print("{:^30}\t\t{:^40}\t\t{:^50}".format(Title()[i],getBf()[i],danmu()[i]))#输出 + datas.append([Title()[i],getBf()[i],danmu()[i]])#将这些存入列表中 + #print(type(datas)) + #print(datas) +#可视化# +#调用xlwt模块中的Workbook方法来创建一个excel表格类型文件, +#其中的第一个参数是设置数据的编码格式,这里是’utf-8’的形式, +# style_compression设置是否压缩,不是很常用,赋值为0表示不压缩。 +#创建excle表格 +book = xlwt.Workbook(encoding='utf-8',style_compression=0) +sheet = book.add_sheet('b站播放量排行榜',cell_overwrite_ok=True) +col = ('标题','播放量/十万','弹幕/k')#设置表格列名 +for i in range(0,3):#列属性元组col写进sheet表单中 + sheet.write(0,i,col[i])#0是第一行,i是第几列,col【i】是列名,在0行i列写入列名 +for i in range(0,15): + data = datas[i] + for j in range(0,3): + sheet.write(i+1,j,data[j]) +book.save('D:\爬虫/可视化.xls') + + +x = [] +y1 = [] +y2 = [] +for i in range(0,15): + x.append(Title()[i]) + y1.append(str(getBf()[i])) + y2.append(str(danmu()[i])) +bar = Bar() +grid = Grid() +bar.add_xaxis(x) +bar.add_yaxis("播放量/十万",y1) +bar.add_yaxis("弹幕数/k",y2) +bar.set_global_opts(title_opts = opts.TitleOpts(title = 'b站热门视频排行榜'),tooltip_opts=opts.TooltipOpts(is_show=False),xaxis_opts=opts.AxisOpts(axislabel_opts={"rotate":35}),yaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=True),)) +bar.set_series_opts(labael_opts = opts.LabelOpts(position = "Top")) +#bar.render("可视化.html") +grid.add(bar,grid_opts = opts.GridOpts(pos_top = "5%",pos_bottom ="55%",pos_left = '35%',pos_right = '5%',))#将bar添加到grid中,距离下端的距离增加55%,距离左侧的距离增加35%,距离右侧的距离增加5% +grid.render("可视化.html") \ No newline at end of file