爬取B站程序猿up主,分析程序猿up出哪些类型的视频会受欢迎
优采云 发布时间: 2020-08-19 20:25爬取B站程序猿up主,分析程序猿up出哪些类型的视频会受欢迎
文章目录
前言
我,一个天天早起,睡前必刷B站的菜鸡程序猿,昨天见到一位关注的程序猿up主发布的动态,心里太不好受,所以才想着做此次的内容
到底程序猿up主做哪些类型的视频就会受大众喜欢呢?
不想看文字就点击图片去看B站我的视频吧,之前似乎可以直接导出视频的,现在iframe不知道为何失效了
开始动手1.首先须要去采集数据
选择到搜索去搜程序猿,然后选择视频,弹幕最多(也就是真实观看的人比较多),去得到每一个视频的链接。
这样我们就先得到每位视频对应的详情页链接,然后再从详情页用xpath去得到标题,up名,up主页等信息(在这个页面直接得到视频点赞数和播放数最后保存的结果是异常值),点赞数和播放数用api去得到。
api只须要视频的id就可以返回相应的json结果,所以得到也是比较便捷的,最后保存到csv文件。
爬虫代码:
import requests
from lxml import etree
import time
import pandas as pd
import re
import json
#https://search.bilibili.com/video?keyword=%E7%A8%8B%E5%BA%8F%E7%8C%BF&order=dm&duration=0&tids_1=36&tids_2=122&page=32
def get_html(url,header):
html=requests.get(url,headers=header).text
return html
def get_all_page(n):
urls=[]
for i in range(1,n+1):
url=f"https://search.bilibili.com/video?keyword=%E7%A8%8B%E5%BA%8F%E7%8C%BF&order=dm&duration=0&tids_1=36&tids_2=122&page={i}"
html=get_html(url,headers)
selector = etree.HTML(html)
li_list=selector.xpath("//ul[@class='video-list clearfix']")
for li in li_list:
urls.extend(li.xpath("//li[@class='video-item matrix']/a/@href"))
return urls
def get_information(urls,avid):
space_url=[]
name_list=[]
views_list=[]
dz_list=[]
video_names=[]
count=0
for url in urls:
count+=1
if count==10:
time.sleep(1)
url=url.replace('//','https://')
print("正在爬取:",url)
html=get_html(url,headers1)
selector = etree.HTML(html)
space_url.append(selector.xpath("//div[@class='name']/a[1]/@href")[0])
name_list.append(selector.xpath("//div[@class='name']/a[1]/text()")[0])
video_names.append(selector.xpath("//h1/@title")[0])
# views_list.append(selector.xpath("//div[@class='video-data']/span[1]/text()")[0])
# dz_list.append(selector.xpath("//div[@class='ops']/span[1]/text()")[0])
for id in avid:
base_url="https://api.bilibili.com/x/web-interface/view?aid="
html=get_html(base_url+id,headers2)
res=json.loads(html)
video_info = res['data']
views_list.append(video_info["stat"]["view"])
dz_list.append(video_info["stat"]["like"])
return space_url,name_list,views_list,dz_list,video_names
def save(n):
urls=get_all_page(n)
avid=[]
for i in urls:
avid.append(re.findall("\d+",i)[0])
space_url,name_list,views_list,dz_list,video_names=get_information(urls,avid)
data=pd.DataFrame({"空间链接":space_url,"up主":name_list,"视频名":video_names,"视频播放次数":views_list,"视频点赞数":dz_list})
data.to_csv('./B站程序猿up主视频信息.csv',encoding='utf8')
print("所有数据爬取完毕")
if __name__ == '__main__':
headers = {
'Host': 'search.bilibili.com',
'Referer': 'https//www.bilibili.com/',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
headers1 = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
'Host': 'www.bilibili.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
}
headers2={
'Host': 'api.bilibili.com',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 79.0.3945 .130Safari / 537.36'
}
n=int(input("请输入想要爬取的页数:"))
save(n)
我爬取了十页,一共200条数据
2.开始数据剖析
基本的导库和导出数据,并且重命名列名
然后对数据清洗和预处理,查看缺失值异常值。但是因为B站数据比较友好,没有异常缺位值。
然后分组剖析点赞数多的up和播放数多的up
这一部分用groupby很简单就实现了,所以只上对点赞的剖析绘图代码
# 找到视频点赞数最多的up主
most_dz=data.groupby(by=data['up主名'],as_index=False)['视频点赞数'].sum()
most_dz.columns=['up主名','视频点赞总数']
most_dz.head()
#降序排序
most_dz=most_dz.sort_values(by=['视频点赞总数'],ascending=False)
most_dz.head(10)
# 可视化点赞数前20的up主
plt.figure(figsize=(13,10))
sns.barplot(most_dz['up主名'][:20],most_dz['视频点赞总数'][:20])
plt.title('程序猿up主视频点赞总数前20', fontsize=22)
plt.grid()
plt.xticks(rotation=90)
plt.show()
3.查看各图中第一的视频类型
我发觉迷糊老师出的视频涉及到编程的比较少,大多是涉及到日常笔记本使用高阶操作的视频。看来我之后要是想点赞数多应当少出点涉及到编程的,多出点能使听众日常使用到的视频 毕竟编程类教学视频都是被埋在采集夹里了,我的采集夹里都有一大堆
纳尼,就只有一个视频就737万+的播放数,这也很强了吧。同时也说明还是有很多人还是乐意在B站学习编程的,特别是python相关的视频似乎非常火
4.做个总结
总结:
在B站教学类视频有很大几率会被放进采集夹喝灰,所以程序猿up主们要紧抓观众们的喜好来创作视频,比如python系列的教学视频就太受欢迎(原因也是python生态好,学上去简单),或者是一些日常笔记本高阶操作的教学的视频,这些都是比较容易吸引到听众的。
从亲爱的程序羊不能步入前20更能发觉这个问题:程序羊的视频质量是很高的,但是受用群体不大,因为他的视频几乎都是讲程序猿的修练,没太多简单易学的,相反大多都是程序猿们认为太有意义,但是圈外人听着一脸懵,根本如同听天书一样的。哈哈,不过对于我们这种程序猿来说这样的up主简直就是宝藏up,也正是由于他选择讲对程序猿最有益的一些内容,放弃一些其他利益,这也能够使我们学到更多更好的知识。
再来瞧瞧一些出发点不同的程序猿up,比如张大米的日常。他能有如此高观看数和点赞数的诱因就是他的视频既兼具了程序猿,利用程序猿的梗可以给我们带来欢乐,同时也照料了其他群体,从一些不这么高深的计算机知识出发,可以使听众更了解程序猿的生活,而且每位视频宽度太短,符合现今短视频的趋势。