news 2026/6/5 8:52:57

Python爬虫实战:用requests库批量获取B站UP主视频的aid和cid(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python爬虫实战:用requests库批量获取B站UP主视频的aid和cid(附完整代码)

Python爬虫实战:B站UP主视频数据抓取全流程解析

最近在分析B站UP主视频数据时,我发现很多朋友对如何批量获取视频的aid和cid这两个关键ID感到困惑。作为视频数据分析的基础,掌握这两个ID的获取方法能帮助我们进一步挖掘播放量、弹幕等深层信息。本文将手把手带你从零开始,用Python的requests库构建一个完整的B站视频数据抓取工具。

1. 理解B站视频ID体系

在开始编写代码前,我们需要先搞清楚几个关键概念:

  • aid:即Archive ID,是B站视频的唯一标识符,每个视频对应一个独特的aid。这个ID主要用于标识视频本身,在视频URL中可以看到(如www.bilibili.com/video/av170001中的170001就是aid)。

  • cid:即Content ID,是视频分P的标识符。一个aid可能对应多个cid(如多P视频),cid主要用于获取视频的弹幕、播放源等信息。

  • mid:这是UP主的唯一标识ID,通过这个ID我们可以找到该UP主发布的所有视频。

常见误区提醒很多初学者容易混淆aid和cid的关系,简单来说:aid定位视频,cid定位视频的具体分P内容。

2. 环境准备与API分析

2.1 安装必要库

我们需要以下Python库支持我们的爬虫程序:

pip install requests

2.2 B站API接口分析

通过浏览器开发者工具分析,我们发现B站提供了几个关键API:

API地址功能描述必需参数
https://api.bilibili.com/x/space/acc/info获取UP主基本信息mid
https://api.bilibili.com/x/space/arc/search获取UP主视频列表mid, pn(页码)
https://api.bilibili.com/x/player/pagelist获取视频cid列表aid

提示:B站API可能会不定期更新,建议在实际使用前先用浏览器开发者工具验证接口是否可用。

3. 核心代码实现

3.1 获取UP主基本信息

首先我们需要通过UP主的mid获取其基本信息,这有助于我们后续的数据验证:

import requests import json def get_up_info(mid): url = f'https://api.bilibili.com/x/space/acc/info?mid={mid}&jsonp=jsonp' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } try: response = requests.get(url, headers=headers) data = response.json() if data['code'] == 0: return { 'name': data['data']['name'], 'mid': data['data']['mid'] } else: print(f"获取UP主信息失败: {data['message']}") return None except Exception as e: print(f"请求发生异常: {str(e)}") return None

3.2 批量获取视频aid

接下来是获取UP主所有视频aid的核心函数:

def get_all_video_aids(mid, max_page=5): video_aids = [] base_url = 'https://api.bilibili.com/x/space/arc/search' for page in range(1, max_page + 1): params = { 'mid': mid, 'pn': page, 'ps': 50, # 每页数量 'jsonp': 'jsonp' } try: response = requests.get(base_url, params=params) data = response.json() if data['code'] == 0: videos = data['data']['list']['vlist'] for video in videos: video_aids.append(video['aid']) else: print(f"第{page}页获取失败: {data['message']}") except Exception as e: print(f"第{page}页请求异常: {str(e)}") return video_aids

3.3 获取视频cid

有了aid后,我们可以进一步获取每个视频的cid:

def get_video_cid(aid): url = f'https://api.bilibili.com/x/player/pagelist?aid={aid}&jsonp=jsonp' try: response = requests.get(url) data = response.json() if data['code'] == 0 and data['data']: return data['data'][0]['cid'] # 取第一个分P的cid return None except Exception as e: print(f"获取aid={aid}的cid失败: {str(e)}") return None

4. 完整流程与异常处理

4.1 主程序逻辑

将上述函数组合起来,形成完整的处理流程:

def main(): # 替换为目标UP主的mid up_mid = '2026561407' # 获取UP主信息 up_info = get_up_info(up_mid) if not up_info: print("无法获取UP主信息,程序终止") return print(f"开始获取UP主 {up_info['name']}(mid:{up_mid}) 的视频数据...") # 获取所有视频aid video_aids = get_all_video_aids(up_mid) if not video_aids: print("未获取到任何视频aid") return print(f"共获取到 {len(video_aids)} 个视频aid") # 获取每个视频的cid video_data = [] for aid in video_aids: cid = get_video_cid(aid) if cid: video_data.append({'aid': aid, 'cid': cid}) # 输出结果 print("\n获取结果:") for idx, item in enumerate(video_data, 1): print(f"{idx}. aid: {item['aid']}, cid: {item['cid']}") if __name__ == '__main__': main()

4.2 常见问题与解决方案

在实际使用中,你可能会遇到以下问题:

  1. 请求被拒绝

    • 确保添加了合适的User-Agent头
    • 尝试降低请求频率,避免被封禁
    • 考虑使用代理IP(需合规使用)
  2. 数据解析失败

    • 检查API返回的JSON结构是否发生变化
    • 验证返回的HTTP状态码是否为200
  3. 分页处理不完整

    • 动态判断是否还有下一页数据,而不是固定页数
    • 处理返回数据为空的情况

性能优化建议对于大量视频的UP主,可以考虑使用多线程或异步请求来提高获取速度,但要注意控制并发量,避免给B站服务器造成过大压力。

5. 数据存储与扩展应用

5.1 数据存储方案

获取到的数据可以保存到多种格式中:

import csv import json def save_to_csv(data, filename): with open(filename, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['序号', 'aid', 'cid']) for idx, item in enumerate(data, 1): writer.writerow([idx, item['aid'], item['cid']]) def save_to_json(data, filename): with open(filename, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2)

5.2 扩展应用方向

有了aid和cid后,你可以进一步:

  • 获取视频的详细统计信息(播放量、点赞数等)
  • 下载视频弹幕进行分析
  • 构建UP主视频数据趋势图
  • 分析视频内容与互动数据的关系

实际案例: 我曾经用这套方法分析过几个教育类UP主的视频数据,发现视频时长在15-20分钟、发布时间在晚上8-10点的视频,其完播率明显高于其他时段发布的视频。这种数据洞察对于内容创作者优化发布策略很有帮助。

6. 法律与道德考量

在进行网络爬虫开发时,我们必须注意:

  • 遵守网站的robots.txt协议
  • 控制请求频率,避免对目标服务器造成负担
  • 仅将数据用于个人学习和分析,不进行商业用途
  • 尊重用户隐私和版权内容

注意:本文提供的代码仅用于学习交流,请勿用于大规模数据抓取或商业用途。实际应用中请遵守相关法律法规和网站的使用条款。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 8:51:38

不只是点灯:深入剖析紫光FPGA Cortex-M1 SoC的仿真验证与Cache机制

紫光FPGA Cortex-M1 SoC的Cache机制与仿真验证实战解析当LED灯在你的紫光FPGA开发板上第一次闪烁时,那种成就感往往伴随着更多疑问:为什么我的变量地址从0x30000000开始?ITCM和ICACHE到底有什么区别?仿真时那些神秘的mem_xxx.dat文…

作者头像 李华
网站建设 2026/6/5 8:48:28

基于Schema标注的企业官网AI可见性优化技术实践

背景与问题 2025年以来,AI搜索正在重塑用户获取信息的方式。当用户通过DeepSeek、豆包、文心等AI平台询问服务需求时,企业是否能被AI主动推荐,直接影响获客效率。 传统SEO优化可以让企业在百度等搜索引擎获得良好排名,但AI搜索引擎…

作者头像 李华
网站建设 2026/6/5 8:47:02

聊透JAVA快排

目录 前言: 一.算法思想: 二.步骤: 三.算法优化: 四.代码实现: 五.算法评判: 六.小结: 前言: 前两周因为机器人省赛以及后续和大家出去庆祝,学习java数据节后和算法…

作者头像 李华
网站建设 2026/6/5 8:46:05

从原理到调试:一次搞懂Camera Sensor的曝光、增益与帧率三角关系

从原理到调试:深入解析Camera Sensor曝光、增益与帧率的动态平衡在低光环境下调试相机时,开发者经常会遇到一个典型现象:明明设置了30fps的帧率,实际输出却骤降到10fps左右。这种帧率"跳水"现象背后,隐藏着曝…

作者头像 李华
网站建设 2026/6/5 8:44:56

MuleSoft企业级AI编排:LLM与业务系统深度集成实战

1. 项目概述:当企业级集成平台遇上大语言模型 “AI Orchestration in Action: How MuleSoft and LLMs Fuel the Future of Enterprise AI”——这个标题不是一句空泛的营销口号,而是我在过去18个月里亲手搭建、上线并持续迭代的三个核心生产系统的真实写…

作者头像 李华