寻找B站的最爱--8月B站全站榜爬虫
本文作者:任 哲,中南财经政法大学经济学院
文字编辑:方 言
技术总编:张馨月
爬虫俱乐部云端课程
那么,B站的网友们究竟喜欢什么呢?废话不多说,下面小编将带您爬取B站的视频排行榜,用数据说话,寻找8月份最受B站欢迎的视频和视频分区。
本文的主要内容如下:
1.爬取B站全站榜月排行
2.爬取上榜视频所在分区
3.寻找最受欢迎视频和视频分区
1.爬取B站全站榜月排行
首先,打开B站全站榜月排行,记录网址。
我们打开开发者模式,在开发者工具里选择Network,此时刷新一下页面,可以看到该网页的请求方式是get:
还有我们需要的请求头信息:
我们导入后面会用到的库,并输入请求头中的信息:
import requests
from lxml import etree
import pandas as pd
import pyecharts
from pyecharts.charts import Pie
from pyecharts import options as opts
headers = {
"authority": "www.bilibili.com",
"method": "GET",
"path": "/ranking/all/0/0/30",
"scheme": "https",
"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",
"cookie": "finger=1571944565; _uuid=67BD27E4-F2ED-E057-34F4-99CBED32B69795653infoc; buvid3=011BAFA2-EB7F-4A6F-936A-12C62388AD7F155808infoc; CURRENT_FNVAL=16; PVID=1; sid=kr4gl2cn; LIVE_BUVID=AUTO9015981734240039; finger=1571944565",
"referer": "https://www.bilibili.com/?spm_id_from=333.909.b_696e7465726e6174696f6e616c486561646572.1",
"sec-fetch-dest": "document",
"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/84.0.4147.135 Safari/537.36"
}
接下来将网页内容爬取下来:
url_1 = "https://www.bilibili.com/ranking/all/0/0/30"
html_1 = requests.get(url_1,headers=headers)
tree = etree.HTML(html_1.text)
print(html_1)
返回状态码为200,表示成功爬取。
在B站全站榜月排行中可以发现视频公布的有标题、播放量、评论量、UP主、综合得分等信息,我们只爬取最有参考意义的标题、播放量、UP主三类信息。我们可以使用Xpath Helper定位到标题、播放量、UP主的xpath以备使用:
#设置所需信息对应的xpath
title_xpath ="//a[@class='title']/text()"
play_xpath ="//div[@class='detail']/span[@class='data-box'][1]/text()"
up_xpath ="//a/span[@class='data-box']/text()"
由于视频所在分区要点开具体的视频才能获取,我们还需找到每条上榜视频对应链接的xpath以备使用。通过观察,不难发现,我们只需要获取标题对应xpath节点的href属性值,就可以得到想要的信息了:
url_xpath ="//li/div[2]/div[2]/a/@href"
title_list=tree.xpath(title_xpath)
play_list=tree.xpath(play_xpath)
up_list=tree.xpath(up_xpath)
url_list=tree.xpath(url_xpath)
#将爬取到的信息放入all_df1之中,并修改列名
all_df1 = pd.DataFrame(data = [title_list, up_list, play_list, url_list]).T
all_df1.columns = ["标题", "up主","播放量" , "url"]
部分结果如下:
2.爬取上榜视频所在分区
接下来,进行对视频所在分区的爬取,同样也是先找到相应xpath以备使用。
为了方便爬取结果与前文的all_df1进行合并,我们还需要对标题再次爬取。再次爬取标题时注意,带有 活动作品 标志的标题,与普通标题的xpath是不同的,我们定义时要同时包含两种情况。具体如下:
title2_xpath = "//span[@class='tit']/text()|//span[@class='tit tr-fix']/text()"
blank1_xpath = "//span[@class='a-crumbs']/a[1]/text()"
每个视频的链接都被放在了url_list之中。这样我们可以对url_list进行循环爬取所有上榜视频的分区。定义2个列表title_list、blank1_list,在每次循环结束后,把爬取信息拼接到对应列表中:
title2_list = []
blank1_list = []
#根据url_list中的链接爬取排行榜中的各个视频
for url_2 in url_list :
html_2 = requests.get(url_2)
tree = etree.HTML(html_2.text)
title=tree.xpath(title2_xpath)
blank1=tree.xpath(blank1_xpath)
#将每个视频中爬取的信息拼接到列表之中
title2_list.extend(title)
blank1_list.extend(blank1)
循环结束后,把这两个列表放入到all_df2之中,通过 标题 这一列与all_df1进行合并得到df:
#生成all_df2并和all_df1合并
all_df2 = pd.DataFrame(data = [title2_list, blank1_list]).T
all_df2.columns = ["标题", "分区"]
df =pd.merge(all_df1,all_df2,on='标题')
之后删除url这一列, 并将播放量中的数据改为数值型之后导出到B站全站榜月排行这一excel文件。
具体代码如下:
#删除url所在列
df =df.drop('url',axis=1)
#将播放量数据改为数值型,并导出
df['播放量'].replace(regex=True,inplace=True,to_replace=r'万',value=r'')
df['播放量'] = df['播放量'].astype('float')
df =df.rename(columns={'播放量': '播放量(单位:万)'})
file = r"./B站全站榜月排行.xlsx"
df.to_excel(file, index = None)
这样就得到了需要的全部信息(下图展示部分数据):
3.寻找最受欢迎视频和视频分区
爬取到所有需要的数据,我们下面开始分析。
首先,我们根据播放量进行排名,并导出到Excel中:
playrank=df.sort_values(by=['播放量(单位:万)'],ascending=False)
file = r"./B站全站榜月排行——播放量排名.xlsx"
playrank.to_excel(file, index = None)
打开Excel可以看到统计的前十名如下:
可以看到,截止到爬取当天(8月31日),游戏科学新作《黑神话:悟空》13分钟实机演示以2202.1万的播放量遥遥领先,毫无疑问是B站8月份最受欢迎的视频。
我们再统计各视频分区在月榜中出现的次数,并利用pyecharts绘制为饼图:
#统计各分区出现次数
分区rank=df['分区'].value_counts()
#绘制饼图
分区rank=分区rank.reset_index()
fenqu1=分区rank['分区'].values.T.tolist()
fenqu2=分区rank['index'].values.T.tolist()
pie=(
Pie()
.add(
"",
[(a,b) for (a,b) in zip(fenqu2,fenqu1)],
radius=["30%", "50%"],
center=["40%", "50%"],
rosetype="area",
)
.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False),
title_opts=opts.TitleOpts(title="各分区上榜次数")
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}"),)
)
pie.render('pie.html')
根据饼图,我们可以清晰的看到动画区和生活区均为22次上榜,并列第一。
从结果来看,B站最受欢迎的视频分区是动画区和生活区。其中,动画区的出现在情理之中,毕竟B站是靠动漫发家,只能说一句,不愧是你,Bilibili! 但B站对生活区的喜爱已经追上了动画区,并且鬼畜区,知识区的上榜次数也是不能忽略的,这表明B站对其他视频分区的需求也在不断上升。
总的来说,通过对全站榜月排行进行分析,B站的形象逐渐清晰了起来。B站是一个热爱生活,喜欢恶搞,但也不忘学习、娱乐两手一起抓的二次元爱好者形象。这个形象不正是在这片土地上茁壮成长的年轻人吗?这么看来,B站是中国年轻代高度聚集的文化社区和视频平台这一说法,倒也是名副其实的了。
最后,既然今天聊得是和B站有关的话题,那在就少不了在结束时来一句:
哔哩哔哩 干杯 - ( ゜- ゜)つロ!!!
cnaddress命令——实现经纬度转换为中文地址
Python入门—Spyder的简单使用
追踪命令set trace on——解你燃眉之急
爬虫大杀器 | “手把手”教你配置Selenium
小白必看!Anaconda安装全攻略
用WordStat看中国日报新闻(二)
一招轻松合并文件——openall命令介绍
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。