rulianjie2 发表于 2026-5-4 03:38:05

AI编程实战:用Cursor开发B站视频批量下载工具,从0到可商用

很多人觉得编程很难,觉得那是程序员的专属技能。2026年了,AI编程工具已经非常成熟,普通人用AI辅助编程,完全可以独立开发出实用的小工具。
今天分享一个真实案例:我是怎么做B站视频批量下载工具的。整个开发过程,从需求分析到代码实现,全都是用Cursor AI编程助手完成的。
一、需求分析:明确要做什么

我需要批量下载B站上某个UP主的所有视频,用于离线观看和学习。之前试过一些现成工具,但要么有水印,要么下载速度慢,要么需要付费。
核心需求:

[*]支持输入B站UP主主页URL,自动获取所有视频列表
[*]支持选择下载质量(高清/1080P/720P)
[*]支持断点续传,避免网络中断后重新下载
[*]支持多线程并发下载,提高效率
二、用Cursor开始开发

1. 创建项目结构

打开Cursor,新建Python项目。先让AI帮我设计项目结构:
bilibili_downloader/├── main.py            # 主入口├── config.py            # 配置文件├── video_fetcher.py   # 视频列表获取├── downloader.py      # 下载器核心└── requirements.txt   # 依赖库2. 获取视频列表

让Cursor帮我写获取B站UP主视频列表的代码:
import requestsimport jsonfrom typing import List, Dictclass BilibiliFetcher:    def __init__(self):      self.headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'      }      def get_upvideos(self, uid: str, cookie: str = None) -> List:      """获取UP主的所有视频"""      url = f"https://api.bilibili.com/x/space/wbi/arc/search"      params = {            'mid': uid,            'pn': 1,            'ps': 30,            'order': 'pubdate'      }                response = requests.get(url, params=params, headers=self.headers)      data = response.json()                videos = []      if data['code'] == 0:            for item in data['data']['list']['vlist']:                videos.append({                  'bvid': item['bvid'],                  'title': item['title'],                  'aid': item['aid'],                  'duration': item['length'],                  'pubdate': item['pubdate']                })      return videos3. 开发下载器

下载器是核心部分,需要处理视频解析、并发下载、进度显示等功能:
import asyncioimport aiohttpfrom pathlib import Pathimport jsonclass VideoDownloader:    def __init__(self, max_concurrent: int = 3):      self.max_concurrent = max_concurrent      self.semaphore = asyncio.Semaphore(max_concurrent)      async def download_single(self, session, bvid, save_path):      """下载单个视频"""      async with self.semaphore:            # 获取视频下载链接            url = f"https://api.bilibili.com/x/player/playurl?bvid={bvid}&qn=80"            async with session.get(url) as resp:                data = await resp.json()                            if data['code'] != 0:                print(f"获取 {bvid} 下载链接失败")                return False                        video_url = data['data']['durl']['url']                        # 下载视频            async with session.get(video_url) as video_resp:                content = await video_resp.read()                            with open(save_path, 'wb') as f:                f.write(content)                        return True      async def batch_download(self, videos: List, save_dir: str):      """批量下载"""      Path(save_dir).mkdir(parents=True, exist_ok=True)                async with aiohttp.ClientSession() as session:            tasks = []            for video in videos:                safe_title = self.sanitize_filename(video['title'])                save_path = f"{save_dir}/{safe_title}.mp4"                tasks.append(self.download_single(session, video['bvid'], save_path))                        await asyncio.gather(*tasks)4. 添加进度显示

让工具更专业一点,加上进度显示和统计功能:
from tqdm import tqdmclass ProgressDownloader(VideoDownloader):    def __init__(self, *args, **kwargs):      super().__init__(*args, **kwargs)      async def batch_download(self, videos, save_dir):      Path(save_dir).mkdir(parents=True, exist_ok=True)                async with aiohttp.ClientSession() as session:            with tqdm(total=len(videos), desc="下载进度") as pbar:                for video in videos:                  safe_title = self.sanitize_filename(video['title'])                  save_path = f"{save_dir}/{safe_title}.mp4"                                        success = await self.download_single(                        session, video['bvid'], save_path                  )                  pbar.update(1)                  pbar.set_postfix({                        '当前': video['title'][:20],                        '状态': '✓' if success else '✗'                  })三、遇到的问题和解决

问题1:B站API需要登录

B站某些高清视频需要登录才能下载。解决方案:让用户粘贴自己的Cookie,工具自动解析并使用。
问题2:网络中断导致下载失败

加了断点续传功能,保存下载进度到JSON文件,下次启动自动跳过已完成的视频。
问题3:文件名包含特殊字符

Windows系统文件名不能包含特殊字符,添加了文件名清理函数:
import redef sanitize_filename(self, filename: str) -> str:    """清理文件名,移除非法字符"""    filename = re.sub(r'[<>:"/\|?*]', '', filename)    filename = filename[:200]# 限制长度    return filename四、使用效果

用这个工具,下载一个UP主的100个视频:

[*]之前用现成工具:需要2小时,有水印
[*]现在用自己开发的工具:30分钟完成,无水印,支持断点续传
最重要的是,这个工具可以根据自己的需求随时修改和扩展。
五、总结

用AI编程开发工具的流程:

[*]明确需求,拆解功能模块
[*]让AI写基础代码框架
[*]逐个模块调试,遇到问题让AI修复
[*]组合测试,优化性能和体验
整个开发过程不需要我懂太多编程知识,只需要:

[*]知道这个工具要做什么
[*]能描述清楚遇到的问题
[*]会复制粘贴和运行测试
AI编程让普通人也能开发实用工具。如果你也有重复性工作想自动化,不妨试试用AI帮你开发一个小工具。
作者:汝连杰
平台:抖创汇AI编程版块
页: [1]
查看完整版本: AI编程实战:用Cursor开发B站视频批量下载工具,从0到可商用