探秘B站2020年周热门视频(数据分析)
1.数据抓取
数据集的获取是我们进行数据分析的第一步。现在获取数据的主要途径一般为:现成数据;自己写爬虫去爬取数据;使用现有的爬虫工具爬取所需内容,保存到数据库,或以文件的形式保存到本地。
推荐阅读:Python 静态爬虫、Python Scrapy网络爬虫
爬虫的设计思路
- 首先确定需要爬取网页 URL 地址
- 通过 HTTP/HTTPS 协议来获取相应的 HTML 页面
- 提取 HTML 页面里有用的数据
a. 如果是需要的数据就保存起来
b. 如果是页面里的其他 URL,那就继续执行第二步。
爬虫基本流程
发起请求 通过HTTP库向目标站点发起请求,就是发送一个 Request,请求可以包含额外的 header 等信息,等待服务器的响应 获取响应内容 如果服务器正常响应,会得到一个 Reponse, Reponse 的内容便是所要获取的页面内容,类型可能有 HTML,json 字符串,二进制数据(如图片视频)等类型。 解析内容 得到的内容可能是 HTML,可以用正则表达式,网页解析库进行解析,可能是 json,可以直接转为 JSON 解析对象解析,可能是二进制数据,可以做保存或者进一步处理。 保存数据保存的形式多种多样,可以保存成文本,也可以保存到数据库,或者保存特定格式文件
反爬虫机制与对策
机制
- 通过分析用户请求的Headers信息进行反爬虫。网站中应用的最多
- 通过验证用户行为进行反爬虫,不如通过判断同一个ip在短时间内是否频繁访问对应网站等进行分析。
- 通过动态页面增加爬取的难度,达到反爬虫目的。
对策
- 在爬虫中构造这些用户请求的 headers 信息,以此将爬虫伪装成浏览器
- 使用代理服务器并经常切换代理服务器方式,一般就能够攻克限制。
- 利用一些软件,比如selenium+phantomJS就可以攻克 反爬虫的手段 :user-agent、代理、验证码、动态数据加载、加密数据
数据的选择与处理
- 网页文本,如HTML文档 json格式文本 ;
- 图片,获取到的是二进制文件保存为图片格式 ;
- 视频 获取的二进制文件保存为视频格式即可;
- 其他 只要能请求到的,都能获取 。
解析方式
- 直接处理
- json解析
- 正则表达式
- BeautifulSoup
- PyQuery
- XPath
2. 数据清洗
数据得到手,我们就需要对我们爬取的数据进行清洗工作,为之后的数据分析做铺垫,如果清洗的不到位势必会对之后的数据分析造成影响。 下文将从数据格式统一、空值处理。
推荐好课:Python3进阶:数据分析及可视化
格式统一
去掉数据的空格中,在用爬虫进行数据爬取时用 strip() 对爬取的字符串进行处理,将中文数据转换为阿拉伯数字。
例如1.7万变成17000,代码如下:
def get_int(s):
if s[-1]=="万":
s=s[0:-1]
s=int(float(s)*10000)
else:
s=int(s)
return s
运行结果如下
if __name__ == '__main__':
s="1.2万"
price = get_int(s)
print(price)#12000
空值处理
用爬虫对数据爬取的时候,若爬取的值不存在会报错,用异常处理语句 try{} except: pass (try 为爬取视频信息的代码),跳过不存在的视频信息数据。
try:
html=requests.get(Link).text
doc=BeautifulSoup(html);
List=doc.find('div',{'class':'ops'}).findAll('span')
like=List[0].text.strip()#点赞
like=self.getint(like)
coin=List[1].text.strip()#投币
coin=self.getint(coin)
collection=List[2].text.strip()#收藏
collection=self.getint(collection)
print('点赞',like)
print('投币',coin)
print('收藏',collection)
# #将数据 拼合成字典
data={
'Title':Title,
'link':Link,
'Up':Up,
'Play':Play,
'Like':like,
'Coin':coin,
'Collection':collection,
}
# 存储到csv文件
self.write_dictionary_to_csv(data,'blibli2.csv')
pass
except:
pass
3.数据分析及可视化
表格参数信息如图
对视频排放量进行分析
对 B 站热门播放量进行分析,对 2020 年热门视频的播放量分为 4 个等级 一千万排放量以上为一个等级 五百万到一千万播放量为一个等级 五百万到一百万播放量为一个等级 一百万播放量以下为一个等级
l1=len(data[data['Play'] >= 10000000])
l2=len(data[(data['Play'] < 10000000) & (data['Play'] >=5000000)])
l3=len(data[(data['Play'] < 5000000) & (data['Play'] >=1000000)])
l4=len(data[data['Play'] < 1000000])
再数据通过 matplotlib 库进行可视化。得到下图。
plt.figure(figsize=(9,13)) #调节图形大小
labels = ['大于一千万','一千万到五百万','五百万到一百万','小于一百万'] #定义标签
sizes = [l1, l2, l3, l4] #每块值
colors = ['green', 'yellow', 'blue', 'red'] #每块颜色定义
explode = (0,0,0,0) #将某一块分割出来,值越大分割出的间隙越大
# 中文乱码和坐标轴负号处理
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
patches,text1,text2 = plt.pie(sizes,
explode=explode,
labels=labels,
colors=colors,
autopct = '%3.2f%%', #数值保留固定小数位
shadow = False, #无阴影设置
startangle =90, #逆时针起始角度设置
pctdistance = 0.6) #数值距圆心半径倍数距离
#patches饼图的返回值,texts1饼图外label的文本,texts2饼图内部的文本
# x,y轴刻度设置一致,保证饼图为圆形
plt.axis('equal')
plt.title("B站热门播放量分布图")
plt.legend() # 右上角显示
plt.show()
从图中可以看出,在 B 站能上每周必看热门推荐的视频播放量大部分在五百万到一百万播放量,低于一百万播放量的视频很难上每周必看热门推荐,而一年中播放量达到于一千万的视频也很少。 让我们一起看看播放量排名前 10 的视频是那些好看的视频
data.nlargest(10,columns='Play')
再数据通过 matplotlib 库进行可视化。得到下图。
d.plot.bar(figsize = (10,8),x='Title',y='Play',title='Play top 10')
plt.xticks(rotation=60)#夹角旋转60度
plt.show()
从图中可以看出哔哩哔哩拜年祭最受欢迎且播放量远远高于其它视频,说明B站2020年拜年祭节目进行的比较成功。
对作者进行分析
通过数据分析看那个作者的作品上热门次数最多,从而判断那个作者在2020年中最受欢迎。 对作者进行划分,统计出现的次数
d2=data.loc[:,'Up'].value_counts()
d2=d2.head(10)
再数据通过 matplotlib 库进行可视化。得到下图。
d2.plot.bar(figsize = (10,8),title='UP top 10')
plt.show()
说明 B 站上每周热门次数最多的作者是凉风 Kaze,一年 52 周热门推荐,一共出现了 48 次,几乎每周热门都有他的视频出现。从数据来看,2020 年最受欢迎的作者是凉风 Kaze。
对视频参数分析
对热门视频的点赞,投币,收藏平均比例进行分析
data['点赞比例'] = data['Like'] /data['Play']
data['投币比例'] = data['Coin'] /data['Play']
data['收藏比例'] = data['Collection'] /data['Play']
d3=data.iloc[:,8:11]
d3=d3.mean()
再数据通过 matplotlib 库进行可视化。得到下图。
d3.plot.bar(figsize = (10,8),title='UP top 10')
plt.show()
2020年中点赞比例最高,达到大约9%。说明在B站看视频的人,平均10个人中才会有一个人点赞。而平均平均20个人中才会有一个人对视频进行投币。
对标题进行分析
对标题高频次进行提取,看那类标题比较受欢迎 首先对所有标题进行遍历,储存在字符串s中
d4=data['Title']
s=''
for i in d4:
s=s+i
然后用词云进行可视化
标题中带有“朱一旦,半佛,罗翔”等作者名或“英雄联盟,原神”等游戏热门视频比较多。