反爬虫机制与对策
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).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
然后用词云进行可视化
标题中带有“朱一旦,半佛,罗翔”等作者名或“英雄联盟,原神”等游戏热门视频比较多。
近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地