网络爬虫名称:bilibili弹幕网视频日排行榜数据分析
网络爬虫爬取的内容:bilibili弹幕网视频日排行榜
设计方案概述:
实现思路:爬取网站html源代码,通过页面分析得到想要的数据位置,提取数据,之后数据可视化等操作
技术难点: html源码过于杂乱,难以提取数据
首先进行页面分析
通过页面分析,我们得知我们需要的关键数据在"li"分支
将"li"分支展开,进一步分析
通过对"li"分支的分析,我们基本确定了播放量,弹幕数,综合得分等关键信息所在的位置
接下来开始爬取
importrequests as rqfrom bs4 importBeautifulSoupimportpandas as pdimportmatplotlib.pyplot as plt
url= "https://www.bilibili.com/ranking/all/0/0/1"header= {"User-Agent":"Mozilla/5.0"}
res= rq.get(url,headers=header,timeout=15)
res.raise_for_status()
res.encoding=res.apparent_encoding
soup= BeautifulSoup(res.text)
使用requests库爬取,并通过BeautifulSoup库存放到变量Soup中,这里展示一下爬取到的html,可以看到是非常杂乱的
然后开始对数据进行提取,首先是获取视频标题,同样的,我输出一下提取到的标题
#获取视频标题
title =[]for dtitle in soup.find_all('img'):
title.append(dtitle.get('alt'))
接下来同理,提取一些关键信息,因数据略大,就不输出展示了
#获取视频的播放量,弹幕数和UP主
cl_soup=soup.find_all(attrs={'class':'data-box'})
play_view_author=[]for cl_soup incl_soup:
play_view_author.append(cl_soup.text)
play= play_view_author[0:300:3] #播放量
view = play_view_author[1:300:3] #弹幕数
author = play_view_author[2:300:3] #UP主#获取视频的BV号
dBV = soup.find_all(attrs={'class':'title'})
link=[]for dBV indBV:
link.append(dBV.get('href'))for i inrange(link.count(None)):
link.remove(None)
BV=[]for k inrange(len(link)):
BV.append(link[k][-12:])#获取视频的综合得分
soup_pts=soup.find_all(attrs={'class':'pts'})
pts=[]for soup_pts insoup_pts:
pts.append(eval(soup_pts.text[:-15]))
好的,现在关键信息已经获取完成,将其通过pandas库保存为csv表格方便稍后进行数据分析可视化调用
dt = {'排名':range(1,101),'标题':title,'播放量':play,'弹幕数':view,'综合得分':pts,'UP主':author,'BV号':BV} #创建字典
data = pd.DataFrame(dt) #以字典形式创建DataFrame
importdatetime
date= datetime.datetime.now().strftime('%Y-%m-%d') #获取当前日期方便保存
data.to_csv('{}.csv'.format(date),index=False,header=True,encoding="utf-8-sig",mode="a") #保存为csv
此处应该注意,这里的保存时一定要写编码方式,否则很有可能保存的csv出现乱码的现象
接下来对数据进行清洗并可视化分析
读入csv文件
importpandas as pdimportmatplotlib.pyplot as pltfrom scipy.o