百木园-与人分享,
就是让自己快乐。

python爬取B站Top100,不小心发现了热门UP主的秘密

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

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

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

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

在这里插入图片描述

需求分析

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

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

等信息。

在这里插入图片描述

网页分析

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

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

在这里插入图片描述

发送请求

Python插件\\学习\\资料Q群:906715085####
  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,有不明白的小伙伴可以看看这份教程,这个是我自己总结的一份实用性很高的熊猫文档。

让人无法拒绝的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
  \'\'\'

 

在这里插入图片描述

最后

这一篇为大家分享的B站到这里就没有了,不知道小伙伴们学会了没有。不管学没学会都给我点一个赞吧,毕竟密密麻麻的代码也是够辛苦的啦。到这里就结束了,下一篇见。
在这里插入图片描述


来源:https://www.cnblogs.com/123456feng/p/16108035.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » python爬取B站Top100,不小心发现了热门UP主的秘密

相关推荐

  • 暂无文章