查看原文
其他

寻找B站的最爱--8月B站全站榜爬虫

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:任   哲,中南财经政法大学经济学院

文字编辑:方   言

技术总编:张馨月

爬虫俱乐部云端课程

     爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营在不久前已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!     


前段时间,单机游戏《黑神话:悟空》在B站上发布了一则实机操作视频,引起了巨大轰动,短短一天播放量就破了千万大关。B站作为一个拥有大量年轻用户的网站,一则游戏视频能够引发轰动听起来是情理之中的,但如果仔细想B站给人留下的印象,就变得模糊了起来,B站都是二次元?喜欢鬼畜恶搞?吃播?最近好像又有很多人在B站学习?

  那么,B站的网友们究竟喜欢什么呢?废话不多说,下面小编将带您爬取B站的视频排行榜,用数据说话,寻找8月份最受B站欢迎的视频和视频分区。

  本文的主要内容如下:

  1.爬取B站全站榜月排行

  2.爬取上榜视频所在分区

  3.寻找最受欢迎视频和视频分区

1.爬取B站全站榜月排行

  首先,打开B站全站榜月排行,记录网址。

  我们打开开发者模式,在开发者工具里选择Network,此时刷新一下页面,可以看到该网页的请求方式是get:

  还有我们需要的请求头信息:

  我们导入后面会用到的库,并输入请求头中的信息:

import requestsfrom lxml import etreeimport pandas as pdimport pyechartsfrom pyecharts.charts import Piefrom 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以备使用:

#设置所需信息对应的xpathtitle_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"
这样,我们就抓取到了本页面所需的全部信息,我们可以使用DataFrame将这些信息储存:
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]).Tall_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]).Tall_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站有关的话题,那在就少不了在结束时来一句:

  哔哩哔哩 干杯 - ( ゜- ゜)つロ!!!

如需下载完整程序,请点击阅读原文哦~






对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

cnaddress命令——实现经纬度转换为中文地址

定位神器——cngcode

Python入门—Spyder的简单使

Jupyter Notebook 的这些tips你了解吗?
给变量名换马甲之rename命令

追踪命令set trace on——解你燃眉之急

爬虫大杀器 | “手把手”教你配置Selenium

小白必看!Anaconda安装全攻略

数据类型转换之destring和tostring命令

mvencode和mvdecode——打开缺失值与特定数值转换大门的钥匙
优雅的map()
Python实现Excel中vlookup函数功能
Stata实现Excel中vlookup函数功能
gen与egen,傻傻分不清楚?

用WordStat看中国日报新闻(二)

一招轻松合并文件——openall命令介绍

爬虫俱乐部平安经
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存