Python怎么爬取B站排行榜视频播放量和视频评论量等数据

发布时间:2021-11-25 09:28:58 作者:iii
来源:亿速云 阅读:923
# Python怎么爬取B站排行榜视频播放量和视频评论量等数据

## 前言

B站(哔哩哔哩)作为国内领先的视频分享平台,其排行榜数据对内容创作者和数据分析师具有重要价值。本文将详细介绍如何使用Python爬取B站排行榜中的视频播放量、评论量等关键数据,涵盖技术选型、反爬策略、完整代码实现和数据分析思路。

---

## 一、技术准备

### 1.1 核心工具包
```python
import requests  # 网络请求
from bs4 import BeautifulSoup  # HTML解析
import json  # 处理JSON数据
import pandas as pd  # 数据存储
import time  # 延时控制

1.2 需要安装的库

pip install requests beautifulsoup4 pandas

1.3 推荐开发环境


二、B站数据接口分析

2.1 官方排行榜接口

B站官方提供了公开的排行榜API:

https://api.bilibili.com/x/web-interface/ranking/v2

2.2 接口参数说明

参数名 类型 说明
rid int 分区ID(0为全站)
type str 类型(all/原创/转载)
day int 时间范围(1/3/7)

2.3 示例请求

url = "https://api.bilibili.com/x/web-interface/ranking/v2"
params = {
    "rid": 0,
    "type": "all",
    "day": 3
}
response = requests.get(url, params=params)

三、完整爬取流程

3.1 获取排行榜数据

def get_ranking_data(day=3):
    url = "https://api.bilibili.com/x/web-interface/ranking/v2"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
        "Referer": "https://www.bilibili.com/ranking"
    }
    
    try:
        response = requests.get(url, headers=headers, params={"day": day})
        response.raise_for_status()
        return response.json()
    except Exception as e:
        print(f"请求失败: {e}")
        return None

3.2 解析视频基础信息

def parse_basic_info(item):
    return {
        "bvid": item.get("bvid"),
        "标题": item.get("title"),
        "播放量": item.get("stat", {}).get("view"),
        "弹幕量": item.get("stat", {}).get("danmaku"),
        "作者": item.get("owner", {}).get("name"),
        "综合得分": item.get("pts")
    }

3.3 获取视频详情数据(含评论)

需要调用视频详情API:

def get_video_detail(bvid):
    detail_url = f"https://api.bilibili.com/x/web-interface/view?bvid={bvid}"
    comment_url = f"https://api.bilibili.com/x/v2/reply/main?oid={aid}&type=1"
    
    # 添加随机延时防止封禁
    time.sleep(1.5)
    
    try:
        detail_res = requests.get(detail_url, headers=headers)
        comment_res = requests.get(comment_url, headers=headers)
        
        detail_data = detail_res.json()
        comment_data = comment_res.json()
        
        return {
            "收藏量": detail_data.get("data", {}).get("stat", {}).get("favorite"),
            "硬币数": detail_data.get("data", {}).get("stat", {}).get("coin"),
            "评论数": comment_data.get("data", {}).get("page", {}).get("count")
        }
    except Exception as e:
        print(f"获取详情失败: {e}")
        return None

四、反爬策略应对

4.1 常见反爬措施

  1. User-Agent轮换:准备多个浏览器UA
user_agents = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"
]
  1. 请求频率控制
import random
time.sleep(random.uniform(1, 3))
  1. 代理IP池(可选):
proxies = {
    "http": "http://127.0.0.1:1080",
    "https": "http://127.0.0.1:1080"
}

4.2 登录态维持(如需)

通过requests.Session保持cookies:

session = requests.Session()
login_res = session.post(login_url, data=credentials)

五、数据存储与分析

5.1 存储到CSV

def save_to_csv(data, filename):
    df = pd.DataFrame(data)
    df.to_csv(filename, index=False, encoding='utf_8_sig')

5.2 数据分析示例

# 读取数据
df = pd.read_csv("bilibili_ranking.csv")

# 播放量TOP10
top_views = df.sort_values("播放量", ascending=False).head(10)

# 播放-评论相关性
df[["播放量", "评论数"]].corr()

六、完整代码整合

import requests
import pandas as pd
import time
import random

def main():
    # 1. 获取排行榜
    ranking_data = get_ranking_data()
    if not ranking_data:
        return
        
    # 2. 解析基础数据
    video_list = []
    for item in ranking_data.get("data", {}).get("list", [])[:20]:  # 限制20条
        video_info = parse_basic_info(item)
        
        # 3. 获取详情数据
        detail_info = get_video_detail(video_info["bvid"])
        if detail_info:
            video_info.update(detail_info)
        
        video_list.append(video_info)
        print(f"已获取 {video_info['标题']}")
    
    # 4. 存储数据
    save_to_csv(video_list, "bilibili_ranking.csv")

if __name__ == "__main__":
    main()

七、法律与道德提醒

  1. 遵守B站Robots协议(https://www.bilibili.com/robots.txt)
  2. 控制请求频率(建议≥1秒/次)
  3. 禁止商用数据转售
  4. 建议在非高峰时段采集

结语

本文介绍了通过Python爬取B站排行榜数据的完整方案,实际应用中可根据需求: - 增加分区爬取(修改rid参数) - 实现定时爬取(结合APScheduler) - 进行深度数据分析(如观众情感分析)

完整项目代码已上传GitHub(示例仓库地址),欢迎Star和Issue讨论。 “`

(注:实际文章约1850字,此处为保持简洁展示核心内容框架,完整版会扩展各部分的技术细节和注意事项)

推荐阅读:
  1. Python爬取B站视频的实现方法
  2. 怎么使用python爬取B站千万级数据

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:oracle非归档模式,没有备份,直接拔电导致Undo损坏怎么办

下一篇:.NET Framework匿名类的操作方法是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》