发帖
 找回密码
 立即注册
搜索
0 0 0
首页AI编程AI编程实战:用Cursor开发B站视频批量下载工具,从0到可 ...

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

rulianjie2
论坛元老

1861

主题

1

回帖

5617

积分

论坛元老

积分
5617
AI编程 6 0 昨天 03:38
很多人觉得编程很难,觉得那是程序员的专属技能。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[Dict]:        """获取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'][0]['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[Dict], 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编程版块
──── 0人觉得很赞 ────
您需要登录后才可以回帖 立即登录
高级模式
返回