项目:爬虫B站视频排行榜热度,并数据可视化html
摘要
该实验主要是用python编写爬虫代码,把爬取到的数据进行整理,上传到flourish网站,进行数据最后的可视化。本次实现的是爬取B站的天天视频排行榜的前100名(根据综合评分为标准,非播放量),生成xls文件后整理并生成动态统计图的视频进行赛跑比较。python
1.引言
该论文是在疫情期间,python网课的最后一个考核实验,是验收一学期下来所累积的python知识的成果,因为最后选题方向依然是爬虫项目,没有考虑游戏等模块知识,还没有涉及到更加深的爬虫技术。实现爬虫的数据可视化的来源是平时逛B站时碰见的一些播放量排行榜比较的视频,比较感兴趣,后学习python才发现能够用爬虫技术实现部分效果,固然Java也能够。为了实现数据可视化功能,根据天天不一样的数据咱们能够实现条形图的比赛。浏览器
2.系统结构
整个系统采用了python的爬虫技术,首先简单介绍一下什么是爬虫技术呢?若是咱们把互联网比做一张大的蜘蛛网,那一台计算机上的数据即是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取本身想要的猎物/数据。爬虫是向网站发起请求,获取资源后分析并提取有用数据的程序。而爬虫后获得的各类不一样的有用的数据,为了研究或者美观效果,要进行数据的可视化,这就是数据的处理方式。我把系统简单的分为以下几个步骤:
服务器
该程序引进了python的四个模块,分别为:
(1) os模块;该模块就是对操做系统进行操做,使用该模块必须先导入模块
(2) requests模块;在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests能够垂手可得的完成浏览器可有的任何操做。
(3) xlwt模块;该模块实现对excel文件的写入,程序用到excel文件时要用到的模块,它并非自带的,须要自行安装,命令:python -m pip install xlwt
(4) 解析库lxml,lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,并且解析效率很是高。安装命令:python -m pip install lxml
咱们在浏览器中输入一个网址,敲击回车,看到网站的页面信息。这就是浏览器请求了网站的服务器,获取到网络资源。那么,爬虫也至关于模拟浏览器发送请求,得到到HTML代码。HTML代码里一般包含了标签和文字信息,咱们就从中提取到咱们想要的信息。一般爬虫是从某个网站的某个页面开始,爬取这个页面的内容,找到网页中的其余连接地址,而后从这个地址爬到下一个页面,这样一直不停的爬下去,进去批量的抓取信息。那么,咱们能够看出网络爬虫就是一个不停爬取网页抓取信息的程序。这方面不懂的须要去简单学习网页的构成,一些hmtl知识即可解决问题。
网络
3.实现代码
(1) 首先,导入4个程序须要用到的模块或库架构
import os import requests import xlwt from lxml import html
(2) 经过爬虫哔哩哔哩的网页,提取咱们想要的信息。(按F12)
url表明哔哩哔哩的网址,requests.get(url)是向服务器请求网页资源。以后经过查找一层一层标签下的目的标签返回一个值,再去遍历这个值。
app
def bug(key_once): url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3' #得到一个网页最简单直接的方法就是 r = requests.get(url) ,向服务器请求资源。 response = requests.get(url).text #response.text返回的是Unicode格式,http响应内容的字符串形式,url对应的页面内容 l = html.fromstring(response) #html.fromstring 会解析html 头部中charset属性,而且自动的decode #下面咱们使用相对路径,查找一下相对路径下li标签下的div标签下的class="rank-item",class=content属性的值 matter = l.xpath('//li[@class="rank-item"]/div[@class="content"]/div[@class="info"]') rank = 0 #一开始排名为0 #Python join() 方法用于将序列中的元素以指定的字符链接生成一个新的字符串。 for item in matter: #for循环遍历matter rank += 1 #排名+1 topic = "".join(item.xpath('./a/text()')).replace('"','') #split():拆分字符串。经过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list) playinfo = "".join(item.xpath('./div[@class="detail"]/span/text()')).split("万") play = playinfo[0] + "万" up = "".join(item.xpath('./div[@class="detail"]/a/span/text()')) hot = "".join(item.xpath('./div[@class="pts"]/div/text()')) key_once.append({ #在video_list.append列表末尾添加新的对象 'rank': rank, #排名 'topic': topic, #题目 'play': play, #播放量 'up': up, #up名 'hot': hot #热度 }) return key_once
(3) 将爬取到的数据写入Excel表格当中
首先用xlwt.Workbook()建立一个workbook,用.add_sheet建立一个名字为“b站视频排行榜前100”的sheet。用.write把sheet的表头顺序写为’标题’, ‘up主’,‘综合热度’,‘播放量’, ‘排名’。能够设置字体的样式,和行列的宽度高度,具体的语句百度不少。最后用workbook.save保存文件。
ide
def importance(key_once): workbook = xlwt.Workbook() # 定义、建立一个workbook table = workbook.add_sheet('b站视频排行榜前100') # 添加、建立一个sheet al = xlwt.XFStyle() # 初始化样式 al.horz = 0x02 # 为样式建立字体,设置字体水平居中 al.vert = 0x01 # 设置字体垂直居中 head = ['标题', 'up主','综合热度','播放量', '排名'] # 表头 for y in range(len(head)): table.write(0, y, head[y],al) # 把表头写到Excel里面去 参数对应行,列,值,(格式) i = 1 for item in key_once: # 设置第1、二行的宽度 first_col=table.col(0) sec_col= table.col(1) first_col.width=256*40 sec_col.width=256*25 table.write(i, 0, item['topic'],al) table.write(i, 1, item['up'], al) table.write(i, 2, item['hot'], al) table.write(i, 3, item['play'], al) table.write(i, 4, item['rank'], al) i += 1 # 若是文件存在,则将其删除 if os.path.exists('C:/python/b站视频排行榜前100.xls'): os.remove('C:/python/b站视频排行榜前100.xls') workbook.save('C:/python/b站视频排行榜前100.xls') #保存excel文件的路径 print("生成的文件位于:C:/python/b站视频排行榜前100.xls") if __name__ == '__main__': #调用前面两个函数 key_once = [] importance(bug(key_once))
(4) 把导出的excel文件进行整合
(5) 整合好时间线的文件另存为csv文件,接着上传到flourish网站的Bar chart race模式。
(6) 可在右侧合理调整统计图的样式,最后生成动态统计图。
函数
4.实验
(1) 运行成功界面
(2) 获得咱们想要的数据文件
学习
(3) 整合几天的数据(这里因为没有预判到数据的时间差,只有两天,对比不是特别明显),像一些up主作一些国内国外的疫情动态统计图或者地图,比较有好的观看体验,可是获取数据有点麻烦,数据多的状况下须要用python写一个整合的代码比较方便,就不爬了~~
(4) 在flourish网站上直接导入整合好的csv文件,生成动态统计图。Flourish是款很方便的“动态数据图”制做软件,在国外可以直接访问,可是须要用到google服务器。(不会用的小伙伴自行百度啦)
5.总结和展望
爬虫技术说简单也很简单,说难也能够很深水,在爬虫以前我先学习了一些html,对网页的构成元素有必定的了解,知道标签的运用。整个实验过程当中,最不足的是不了解一些函数和方法的使用。有时候是先想着这个功能该怎么实现,再去查找实现的办法才学会这个函数或方法。