您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # Python怎么爬取B站排行榜视频播放量和视频评论量等数据
## 前言
B站(哔哩哔哩)作为国内领先的视频分享平台,其排行榜数据对内容创作者和数据分析师具有重要价值。本文将详细介绍如何使用Python爬取B站排行榜中的视频播放量、评论量等关键数据,涵盖技术选型、反爬策略、完整代码实现和数据分析思路。
---
## 一、技术准备
### 1.1 核心工具包
```python
import requests  # 网络请求
from bs4 import BeautifulSoup  # HTML解析
import json  # 处理JSON数据
import pandas as pd  # 数据存储
import time  # 延时控制
pip install requests beautifulsoup4 pandas
B站官方提供了公开的排行榜API:
https://api.bilibili.com/x/web-interface/ranking/v2
| 参数名 | 类型 | 说明 | 
|---|---|---|
| rid | int | 分区ID(0为全站) | 
| type | str | 类型(all/原创/转载) | 
| day | int | 时间范围(1/3/7) | 
url = "https://api.bilibili.com/x/web-interface/ranking/v2"
params = {
    "rid": 0,
    "type": "all",
    "day": 3
}
response = requests.get(url, params=params)
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
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")
    }
需要调用视频详情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
user_agents = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"
]
import random
time.sleep(random.uniform(1, 3))
proxies = {
    "http": "http://127.0.0.1:1080",
    "https": "http://127.0.0.1:1080"
}
通过requests.Session保持cookies:
session = requests.Session()
login_res = session.post(login_url, data=credentials)
def save_to_csv(data, filename):
    df = pd.DataFrame(data)
    df.to_csv(filename, index=False, encoding='utf_8_sig')
# 读取数据
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()
本文介绍了通过Python爬取B站排行榜数据的完整方案,实际应用中可根据需求: - 增加分区爬取(修改rid参数) - 实现定时爬取(结合APScheduler) - 进行深度数据分析(如观众情感分析)
完整项目代码已上传GitHub(示例仓库地址),欢迎Star和Issue讨论。 “`
(注:实际文章约1850字,此处为保持简洁展示核心内容框架,完整版会扩展各部分的技术细节和注意事项)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。