听说B站难倒了百分之99的新手?教你用Python从零开始搞定B站!

247 阅读5分钟

现在大家的生活中,已经越来越离不开B站了,

2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户。

源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉丝的up主比比皆是。

今天,小编就带领大家来爬取并分析一下B站的最热视频排行榜,看看大家究竟都喜欢看什么样子的视频~~

需求分析

对于榜单的爬取,我们爬取了榜单的top100视频的

排名、标题、视频链接、播放量、弹幕数量、作者、综合得****分和作者详情页

等信息。

图片

网页分析

首先我们打开浏览器开发者模式如下,所有的信息我们都可以在右边所在的ul标签之中找到,

所以我们先获页面信息,然后使用xpath来获取这些标签信息。

图片

发送请求

  url = 'https://www.bilibili.com/v/popular/rank/all'  headers = {       "cookie": "_uuid=7D3DFA6C-6EB1-F72A-632B-C9AF9B9AD4C627183infoc; buvid3=D25672DE-BD2D-4E7C-B79E-DB356316D023167639infoc; sid=aylq5kgg; fingerprint=84acc3579a53d0eba78d769e71574df6; buvid_fp=BA184AFC-F4DC-408A-8897-D0EDEA653CE5148812infoc; buvid_fp_plain=BA184AFC-F4DC-408A-8897-D0EDEA653CE5148812infoc; DedeUserID=434541726; DedeUserID__ckMd5=448fda6ab5098e5e; SESSDATA=78a505c8%2C1643594982%2Cdfa35*81; bili_jct=1d9f4e960fb0ae7fe1de53663029874b; bsource=search_baidu; CURRENT_FNVAL=80; blackside_state=1; rpdid=|(u)YJR~R~)m0J'uYk)ku)~~)",      "referer": "https://www.bilibili.com/",      "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.8 Safari/537.36"    }  resp = requests.get(url, headers = headers, timeout=15)  ic(resp.text)

获取浏览器响应信息​

图片

接下来我们使用xpath获取标签内部的信息

 for li in lis:    # 排名    sort = li.xpath("./div[@class='num']/text()")    sort = ''.join(sort)    # 作者    author = li.xpath("./div[@class='content']/div[@class='info']/div[@class='detail']/a/span[@class='data-box up-name']/text()")    author = ''.join(author).strip()    # 综合得分    score = li.xpath("./div[@class='content']/div[@class='info']/div[@class='pts']/div/text()")    score = ''.join(score)    # 视频标题    title = li.xpath("./div[@class='content']/div[@class='info']/a[@class='title']/text()")    title = ''.join(title)    # 视频链接    links = li.xpath("./div[@class='content']/div[@class='img']/a/@href")    links = ''.join(links).strip()[2:]    # 播放数量    video_num = li.xpath("./div[@class='content']/div[@class='info']/div[@class='detail']/span[@class='data-box'][1]/text()")    video_num = ''.join(video_num).strip()    # 弹幕数量    barrage_num = li.xpath("./div[@class='content']/div[@class='info']/div[@class='detail']/span[@class='data-box'][2]/text()")    barrage_num = ''.join(barrage_num).strip()    # 作者详情    detail_auth = li.xpath(".//div[@class='content']/div[@class='info']/div[@class='detail']/a/@href")    detail_auth = ['https:' + i for i in detail_auth]    detail_auth = ''.join(detail_auth)    ic(sort, author, score, title,links, video_num, barrage_num, detail_auth)

部分信息如下:

图片

数据保存

接下来我们使用openpyxl模块将获取到的这些信息保存到excel中、

便于后续的数据处理和可视化

  ws = op.Workbook()  wb = ws.create_sheet(index=0)  wb.cell(row=1, column=1, value='排名')  wb.cell(row=1, column=2, value='作者')  wb.cell(row=1, column=3, value='综合得分')  wb.cell(row=1, column=4, value='视频标题')  wb.cell(row=1, column=5, value='视频链接')  wb.cell(row=1, column=6, value='播放数量')  wb.cell(row=1, column=7, value='弹幕数量')  wb.cell(row=1, column=8, value='作者详情')  ws.save('哔哩哔哩Top100.xlsx')

​​

图片

​​

图片

数据处理

我们在处理数据的时候发现,有些数据的单位格式是不一致的,如下:

有些是个为单位,有些是以万为单位。

并且我们要将数字后面的’万‘字去掉,将字符串格式的数字转为数字类型的才便于后续的可视化操作。

图片

​里我们处理数据使用的是pandas,有不明白的小伙伴可以看看这份教程,这个是我自己总结的一份实用性很高的熊猫文档。

  # 读取数据  df = pd.read_excel('哔哩哔哩Top100.xlsx')    # 删除空格   pd_data = df.dropna(subset=['播放数量', '弹幕数量'])  # 格式化数据播放数量  # 去除’万‘  pd_data['播放数量'] = pd_data['播放数量'].str.replace('万', '')  # 转换格式 万->10000  pd_data['弹幕数量'] = pd_data['弹幕数量'].map(lambda x: float(x[:-1]) * 10000 if ('万' in x) else float(x))  # 处理后的数据另存为  pd_data.to_excel('哔哩哔哩Top101.xlsx')

红色是处理之前的数据

绿色是处理之后的数据

我们已经将字符串类型的数字转换成子类型

并且统一数字单位​

图片

接下来我们要找出最多评论的视频和最多弹幕的视频

看看它们为什么这么受欢迎?

  # 最多播放  max_video_num = rcv_data[rcv_data['播放数量'] == rcv_data['播放数量'].max()]  ic(max_video_num)  # 最多弹幕  max_cmts_num = rcv_data[rcv_data['弹幕数量'] == rcv_data['弹幕数量'].max()]  ic(max_cmts_num)  '''  ic| max_video_num:    Unnamed: 0  排名    作者     综合得分                    视频标题                                 视频链接   播放数量   弹幕数量                                 作者详情                   0           0   1  绵羊料理  4742269  一颗柠檬卖100块??美食up主:那是成本!  www.bilibili.com/video/BV1vq4y1Q7TC  445.3  20000  https://space.bilibili.com/18202105  ic| max_bag_num:     Unnamed: 0  排名     作者     综合得分                   视频标题                                 视频链接   播放数量   弹幕数量                                 作者详情                 19          19  20  爆裂吧叶子  2320837  《B 站 各 等 级 用 户 现 状 !》  www.bilibili.com/video/BV1t64y1B7Kz  252.7  84000  https://space.bilibili.com/24450484  '''

这个是播放了最多的视频,

柠檬这么贵是因为小姐姐长得好看么

​​

图片

再来看看弹幕最多的视频

说的啥,大家可以看看,还是相当不错的.

图片

最后我们用的水滴图看一下综合得分占比情况

  # 平均数  mean_score = rcv_data['综合得分'].mean()  # 最大值  max_score = rcv_data['综合得分'].max()  #ic(mean_score/max_score)    '''  ic| mean_score/max_score: 0.39690731166873916  '''

​​

图片

总结

1. 本文详细介绍了如何用Python爬取B站排行榜Top100并可视化分析

有兴趣的读者可以尝试自己动手练习一下。

2. 本文仅供读者学习使用,不做其他用途!

⑥项目源码案例分享有

如果你用得到的话可以直接拿走,在我的QQ技术交流群里群号:754370353(纯技术交流和资源共享,广告勿入)以自助拿走

点击这里 领取