|
|
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") |