如何用Python高效调用B站API:从数据获取到自动化管理的完整指南

【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 【免费下载链接】bilibili-api 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-api

Bilibili API Python库为开发者提供了访问哔哩哔哩平台各类接口的能力,支持视频、音频、直播、动态、专栏、用户、番剧等400+ API调用,是构建B站相关应用的强大工具。

🤔 为什么需要Bilibili API Python库?

在开发B站相关应用时,开发者面临几个核心痛点:

  1. 接口分散:B站官方API分散在不同域名和版本中,难以统一管理
  2. 认证复杂:需要处理SESSDATA、BILI_JCT、BUVID3等多种认证机制
  3. 反爬虫策略:频繁请求容易被限制,需要智能的请求控制
  4. 异步处理:现代Python应用普遍采用异步编程,需要对应的异步支持

bilibili-api-python 库正是为解决这些问题而生,它封装了完整的API调用逻辑,提供统一的异步接口,并内置了反爬虫策略规避机制。

🚀 快速配置与基础使用

环境准备与安装

确保你的Python版本在3.9以上,然后安装核心库和请求客户端:

pip3 install bilibili-api-python

# 选择一个异步请求库
pip3 install aiohttp  # 或 httpx、curl_cffi

获取视频信息的完整示例

import asyncio
from bilibili_api import video

async def analyze_video_data(bvid: str):
    """分析视频数据并提取关键指标"""
    v = video.Video(bvid=bvid)
    
    # 获取视频基本信息
    info = await v.get_info()
    
    # 获取统计数据
    stat = await v.get_stat()
    
    # 获取弹幕信息
    danmaku = await v.get_danmaku()
    
    return {
        "title": info.get("title"),
        "views": stat.get("view"),
        "likes": stat.get("like"),
        "danmaku_count": stat.get("danmaku"),
        "duration": info.get("duration")
    }

# 使用示例
async def main():
    data = await analyze_video_data("BV1uv411q7Mv")
    print(f"视频标题: {data['title']}")
    print(f"播放量: {data['views']:,}")
    print(f"点赞数: {data['likes']:,}")
    print(f"弹幕数: {data['danmaku_count']:,}")

if __name__ == "__main__":
    asyncio.run(main())

🔐 认证机制与用户操作

要进行点赞、收藏、评论等用户操作,需要配置认证信息:

from bilibili_api import Credential, video
import asyncio

async def perform_user_actions():
    # 初始化认证凭证
    credential = Credential(
        sessdata="你的SESSDATA",
        bili_jct="你的BILI_JCT",
        buvid3="你的BUVID3"
    )
    
    # 创建带认证的视频对象
    v = video.Video(bvid="BVxxxxxxxx", credential=credential)
    
    # 执行用户操作
    await v.like(True)      # 点赞
    await v.coin()          # 投币
    await v.favorite()      # 收藏
    
    # 获取用户相关数据
    user_info = await v.get_pagelist()
    return user_info

Bilibili投票模块HTML结构

图:Bilibili投票模块的HTML结构展示,包含data-oid等API调用关键参数

🏗️ 项目架构与核心模块

bilibili-api库采用模块化设计,每个功能都有独立的模块:

模块类别 核心文件 主要功能
视频相关 bilibili_api/video.py 视频信息、弹幕、点赞、投币、收藏
用户相关 bilibili_api/user.py 用户信息、关注、粉丝、空间动态
直播相关 bilibili_api/live.py 直播间信息、弹幕、礼物、分区
搜索相关 bilibili_api/search.py 视频、用户、直播、专栏搜索
动态相关 bilibili_api/dynamic.py 动态发布、转发、评论、点赞
工具模块 bilibili_api/utils/ 辅助函数、转换工具、网络请求

⚡ 性能优化与反爬虫策略

并发请求控制

import asyncio
import time
from bilibili_api import video
from bilibili_api.exceptions import NetworkException, ResponseCodeException

async def batch_video_analysis(bvid_list, max_concurrent=3):
    """批量分析视频数据,控制并发数量"""
    semaphore = asyncio.Semaphore(max_concurrent)
    results = []
    
    async def process_video(bvid):
        async with semaphore:
            try:
                v = video.Video(bvid=bvid)
                info = await v.get_info()
                stat = await v.get_stat()
                results.append({
                    "bvid": bvid,
                    "title": info.get("title"),
                    "views": stat.get("view")
                })
                # 添加延迟避免请求过快
                await asyncio.sleep(0.5)
            except (NetworkException, ResponseCodeException) as e:
                print(f"处理视频 {bvid} 失败: {e}")
    
    # 创建并发任务
    tasks = [process_video(bvid) for bvid in bvid_list]
    await asyncio.gather(*tasks)
    return results

代理配置与请求库选择

from bilibili_api import request_settings, select_client

# 设置HTTP代理
request_settings.set_proxy("http://your-proxy.com:8080")

# 选择不同的请求客户端
select_client("curl_cffi")  # 支持TLS伪装,反爬虫能力强
select_client("aiohttp")    # 标准异步客户端
select_client("httpx")      # 现代化HTTP客户端

# 设置curl_cffi的浏览器伪装
request_settings.set("impersonate", "chrome131")

🔧 实战应用场景

场景一:视频数据分析平台

from bilibili_api import video, user
from datetime import datetime, timedelta
import pandas as pd

class BilibiliAnalytics:
    def __init__(self, credential=None):
        self.credential = credential
    
    async def analyze_channel_performance(self, mid: int, days: int = 30):
        """分析UP主频道最近30天的表现"""
        u = user.User(mid=mid, credential=self.credential)
        
        # 获取用户信息
        user_info = await u.get_user_info()
        
        # 获取视频列表
        videos = await u.get_videos()
        
        # 计算各项指标
        total_views = sum(v.get("play", 0) for v in videos)
        avg_like_rate = sum(v.get("like", 0) for v in videos) / len(videos) if videos else 0
        
        return {
            "up_name": user_info.get("name"),
            "total_videos": len(videos),
            "total_views": total_views,
            "avg_like_rate": avg_like_rate,
            "follower_count": user_info.get("follower")
        }

场景二:自动化内容监控

import asyncio
from bilibili_api import search, hot
import schedule
import time

class ContentMonitor:
    def __init__(self, keywords):
        self.keywords = keywords
        self.previous_results = {}
    
    async def monitor_keyword_trends(self):
        """监控关键词搜索趋势"""
        trends = {}
        
        for keyword in self.keywords:
            s = search.Search(keyword)
            results = await s.get_default()
            
            # 分析趋势变化
            current_count = len(results.get("result", []))
            previous_count = self.previous_results.get(keyword, 0)
            
            trends[keyword] = {
                "current": current_count,
                "previous": previous_count,
                "change": current_count - previous_count
            }
            
            self.previous_results[keyword] = current_count
        
        return trends
    
    async def get_hot_content(self):
        """获取热门内容"""
        hot_list = await hot.get_hot_videos()
        return hot_list[:10]  # 返回前10个热门视频

📊 异常处理与错误调试

完善的异常处理机制

from bilibili_api.exceptions import (
    APIException, NetworkException, ResponseCodeException,
    CredentialNoSessdataException, CredentialNoBiliJctException
)

async def safe_api_call(api_func, *args, **kwargs):
    """安全的API调用包装器"""
    try:
        result = await api_func(*args, **kwargs)
        return {"success": True, "data": result}
    
    except CredentialNoSessdataException as e:
        return {"success": False, "error": "认证信息缺失SESSDATA", "details": str(e)}
    
    except CredentialNoBiliJctException as e:
        return {"success": False, "error": "认证信息缺失BILI_JCT", "details": str(e)}
    
    except NetworkException as e:
        return {"success": False, "error": "网络连接失败", "details": str(e)}
    
    except ResponseCodeException as e:
        if e.code == -412:
            return {"success": False, "error": "请求频率过高,请添加延迟或使用代理"}
        return {"success": False, "error": f"API响应错误: {e.code}", "details": str(e)}
    
    except APIException as e:
        return {"success": False, "error": "API调用异常", "details": str(e)}
    
    except Exception as e:
        return {"success": False, "error": "未知错误", "details": str(e)}

🛠️ 高级功能与自定义扩展

自定义请求客户端

如果你需要集成特定的请求库,可以实现自定义客户端:

from bilibili_api.client import BaseClient
import aiohttp

class CustomAioHTTPClient(BaseClient):
    """自定义aiohttp客户端实现"""
    
    def __init__(self):
        self.session = None
    
    async def request(self, method, url, **kwargs):
        if not self.session:
            self.session = aiohttp.ClientSession()
        
        async with self.session.request(method, url, **kwargs) as resp:
            return {
                "status": resp.status,
                "headers": dict(resp.headers),
                "content": await resp.read()
            }
    
    async def close(self):
        if self.session:
            await self.session.close()

批量操作与数据导出

import json
import csv
from datetime import datetime

class BilibiliDataExporter:
    def __init__(self, output_dir="data"):
        self.output_dir = output_dir
    
    async def export_user_videos(self, mid: int, format="json"):
        """导出用户所有视频数据"""
        u = user.User(mid=mid)
        videos = await u.get_videos()
        
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"{self.output_dir}/user_{mid}_videos_{timestamp}"
        
        if format == "json":
            with open(f"{filename}.json", "w", encoding="utf-8") as f:
                json.dump(videos, f, ensure_ascii=False, indent=2)
        
        elif format == "csv":
            with open(f"{filename}.csv", "w", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=["title", "bvid", "play", "like", "danmaku"])
                writer.writeheader()
                for v in videos:
                    writer.writerow({
                        "title": v.get("title"),
                        "bvid": v.get("bvid"),
                        "play": v.get("play"),
                        "like": v.get("like"),
                        "danmaku": v.get("video_review")
                    })
        
        return len(videos)

🔍 常见问题与解决方案

Q1: 遇到412 Precondition Failed错误怎么办?

原因:请求频率过高触发了B站的反爬虫机制。

解决方案

  1. 添加请求延迟:await asyncio.sleep(0.5)
  2. 使用代理服务器:request_settings.set_proxy("http://your-proxy.com:8080")
  3. 降低并发数量,使用信号量控制

Q2: 如何获取认证信息(SESSDATA、BILI_JCT)?

  1. 登录B站网页版
  2. 打开开发者工具(F12)
  3. 进入Application → Cookies
  4. 找到对应域名的SESSDATA、bili_jct、buvid3值
  5. 注意:这些信息具有账号权限,请妥善保管

Q3: 如何处理异步编程?

如果你不熟悉异步编程,可以使用同步包装器:

from bilibili_api.sync import sync

# 同步方式调用异步函数
v = video.Video(bvid="BV1uv411q7Mv")
info = sync(v.get_info())  # 同步执行

Q4: API调用返回空数据或错误数据?

  1. 检查BVID/AID是否正确
  2. 确认视频/用户是否已被删除或设为私密
  3. 验证认证信息是否过期
  4. 查看是否有网络限制或地区限制

🚀 进阶学习路径

1. 深入研究源码结构

建议阅读以下核心模块:

  • bilibili_api/client.py - 请求客户端实现
  • bilibili_api/utils/network.py - 网络请求处理
  • bilibili_api/exceptions/ - 异常处理机制

2. 探索更多API功能

项目中包含丰富的API模块,每个模块都有详细的功能:

  • bilibili_api/live.py - 直播相关功能
  • bilibili_api/dynamic.py - 动态发布与互动
  • bilibili_api/comment.py - 评论系统操作
  • bilibili_api/search.py - 高级搜索功能

3. 参与项目贡献

如果你发现bug或有新功能需求:

  1. Fork项目仓库:https://gitcode.com/gh_mirrors/bi/bilibili-api
  2. 创建功能分支
  3. 提交Pull Request到develop分支
  4. 遵循项目代码规范

📈 最佳实践总结

  1. 环境隔离:在虚拟环境中安装使用,避免依赖冲突
  2. 认证安全:妥善保管认证信息,不要提交到版本控制
  3. 频率控制:合理控制请求频率,避免触发反爬虫机制
  4. 错误处理:完善的异常处理,确保程序健壮性
  5. 数据缓存:对频繁请求的数据进行本地缓存
  6. 版本更新:定期更新到最新版本,确保API兼容性
  7. 异步优化:充分利用异步并发,提升程序性能

通过合理使用bilibili-api-python库,你可以构建功能丰富的B站相关应用,从简单的数据获取到复杂的自动化系统,都能找到合适的解决方案。记住,技术只是工具,真正的价值在于如何用它创造出有意义的产品和服务。

【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 【免费下载链接】bilibili-api 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-api

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐