数据集的获取是我们进行数据分析的第一步。现在获取数据的主要途径一般为:现成数据;自己写爬虫去爬取数据;使用现有的爬虫工具爬取所需内容,保存到数据库,或以文件的形式保存到本地。 博主用的是用自己编写的爬虫代码获得数据。(爬虫源代码可以找博主要,在评论区回复即可)
爬虫的设计思路1.首先确定需要爬取网页URL地址 2.通过HTTP/HTTPS协议来获取相应的HTML页面 3.提取HTML页面里有用的数据 a.如果是需要的数据就保存起来 b.如果是页面里的其他URL,那就继续执行第二步。
爬虫基本流程发起请求 通过HTTP库向目标站点发起请求,就是发送一个Request,请求可以包含额外的header等信息,等待服务器的响应 获取响应内容 如果服务器正常响应,会得到一个Reponse,Reponse的内容便是所要获取的页面内容,类型可能有HTML,json字符串,二进制数据(如图片视频)等类型。 解析内容 得到的内容可能是HTML,可以用正则表达式,网页解析库进行解析,可能是json,可以直接转为JSON解析对象解析,可能是二进制数据,可以做保存或者进一步处理。 保存数据 保存的形式多种多样,可以保存成文本,也可以保存到数据库,或者保存特定格式文件
反爬虫机制与对策1 通过分析用户请求的Headers信息进行反爬虫。网站中应用的最多 2通过验证用户行为进行反爬虫,不如通过判断同一个ip在短时间内是否频繁访问对应网站等进行分析。 3通过动态页面增加爬取的难度,达到反爬虫目的。 对策 1 在爬虫中构造这些用户请求的headers信息,以此将爬虫伪装成浏览器 2 使用代理服务器并经常切换代理服务器方式,一般就能够攻克限制。 3.利用一些软件,比如selenium+phantomJS就可以攻克 反爬虫的手段 :user-agent、代理、验证码、动态数据加载、加密数据
数据的选择与处理1 网页文本 如HTML文档 json格式文本 2.图片 获取到的是二进制文件保存为图片格式 3.视频 获取的二进制文件保存为视频格式即可 4.其他 只要能请求到的,都能获取 解析方式 1 直接处理 2 json解析 3 正则表达式 4 BeautifulSoup 5 PyQuery 6 XPath
2.数据清洗数据得到手,我们就需要对我们爬取的数据进行清洗工作,为之后的数据分析做铺垫,如果清洗的不到位势必会对之后的数据分析造成影响。 下文将从数据格式统一、空值处理。
格式统一去掉数据的空格中 在用爬虫进行数据爬取时用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).textdoc=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\\\')passexcept: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\\\'] = Falsepatches,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
然后用词云进行可视化
???标题中带有“朱一旦,半佛,罗翔”等作者名或“英雄联盟,原神”等游戏热门视频比较多。