自己编写selenium脚本自动化下载B站视频
创作立场声明:本篇文章为笔者个人的学习实践笔记,仅供学习交流使用。
如今B站上的视频资源无所不包,有很多指的收藏的内容。比如说3b1b的数学讲义让晦涩的高等数学的教学达到了一个新高度。不仅我叹为观止,我也想留下来让我的孩子从中受益,所以仅仅三连收藏就很不踏实。于是我就想寻找一些途径下载到本地。
途径倒是不难找,HotBox就是很棒的下载途径,这是一个工具类网站,提供了流媒体下载、http文件离线下载、磁力链接离线下载三个大功能,使用起来丝滑流畅,收费也很合理,1美元就可以有一个月250G的下载额度,这对我来说已经非常充裕了。需要注意的是,我个人没有下载付费视频的需求,所以这套方案仅针对非付费视频。
手动操作步骤:
1.将视频页面的地址粘贴在流媒体功能的地址栏里,右边就会开始解析。
2.解析好以后就能看到你可以下载到的视频内容,可以看到还有各种清晰度可以选。
3.选择希望下载的清晰度后,点“离线下载”,hotbox就会帮你把视频下载到他的服务器上。下载完成后按钮会变成“下载视频”和“提取音频”。
4.点击你需要的按钮后,就进入了下载链接页面,有欧洲和北美两个区可选,我这欧洲比较快,于是点击欧洲。
自动化选型:
但是这时候问题只解决了一半,因为在使用初期我有大量视频想要下载,手动操作倒是不难,但是离线下载需要时间,在下载一些没有缓存的资源时,500M的资源需要等10分钟左右。数量少的话还可以忍受,但收藏夹有上百个视频想要下载,人就吃不消了。这时候就得上脚本了。
自动化工具我使用selenium,这位可以说是自动化测试领域的顶级工具了。虽然说是自动化测试工具,但功能过于强大,早就不仅仅是用来测试了。他工作的原理是使用chrome官方提供的自动化驱动工具(webdriver)帮你打开一个chrome(或别的浏览器)实例,然后根据你写的脚本通过webdriver在浏览器上完成进入网站、点击链接、输入文字等等操作。
我本人是程序员,对于selenium还是比较熟悉的,而上述整个操作流程对于selenium也没什么大的障碍。这里需要强调一点,现在很多网站有验证码,这种机制就是为了防止自动化而生的,说明网站不希望你自动化这个流程,所以不要试图破解验证码(虽然在某种程度上是可以做到的),但是遇到这种情况时你应该留出时间让“人”来输入验证码,如果你发现不破解验证码你的自动化过程就是去了意义,那说明你不应该自动化这个流程。这一点在selenium官网上也明确得表达了出来。
实现脚本:
目前selenium支持多种语言,java、python、ruby、js都可以,我最近在学习js,于是使用了js版本。需要吐槽的是,官网上的文档非常不系统,你甚至没办法根据官网的文档把环境给搭起来,还得自己上google搜,很多用法细节还得自己看源码才能知道怎么用。
1.搭建环境。
1.1 nodejs环境
因为选择了js作为编程语言,所以需要先搭建nodejs环境。node的安装不再赘述了,很多教程比我写的好。
1.1.1 进入nodejs官网https://nodejs.org/en/,选择LTS(长期支持的稳定版)
1.1.2找一个位置安装nodejs。
1.1.3设置环境变量。我自己的环境变量如下图所示。供参考。
1.1.4验证nodejs 是否生效了,在设置完环境变量后打开一个新的cmd控制台,在上面输入node并回车,如果能正常进入交互式命令行环境,就说明安装成功了。
1.2 下载vs code。
vscode是微软出的开源代码编辑器,在软件行业,前端工程师基本就用这个来敲代码。
进入https://code.visualstudio.com/ 网站,直接下载。下完安装也很简单,不再赘述。
1.3 rest请求工具。
因为我的脚本是挂在http服务上的,这样可以为以后更多的自动化功能留出空间,所以为了调用他你还需要一个能发送http请求的工具——insomnia。 直接进入页面https://insomnia.rest/pricing 下载。
然而下载的时候发现网络很差,因为是在github上,被qiang了,即使连通了速度也非常慢。那怎么办呢?这不是巧了吗?我们有hotbox啊!把下载失败的页面地址粘贴到hotbox的http文件下载功能上。一顿操作后,直接搞定。安装不再赘述了,安装完打开就行。
打开以后各种弹框能关就关,能跳就跳。然后点击右上角,新建请求集,起个名字点create。
然后新建一个请求,起个名字,然后设置请求方式为post,后面的content-type选json,很关键,不然调不通。
顺便吐槽,这种工具最著名的叫做postman,但是他现在非常不思进取,界面臃肿、功能蹩脚、反映迟钝,就在我调试这个脚本时还出现了bug,导致我白白耗费了一小时才发现是postman的问题。
2.构建项目,编写脚本,运行服务。
项目代码上传到了百度云上,因为只是个小脚本就不传github了。
链接: https://pan.baidu.com/s/1y8b9TzXtqiR4X_cctK7NSQ
提取码: 6rse
之前自己学习nodejs时使用了koa2框架搭建了后端服务,这次直接把项目的壳子扒下来用了。这篇文章不是技术文章,就不展开了。剩下的就是写代码,脚本逻辑主要写在web-driver.js文件里面。这里面的参数需要针对自己的情况进行修改。如下所示,第一个红框是你希望把文件下载到的目标目录,第二个红框是你在hotbox的帐号密码。
第三个红框是用来锁定你要下载的视频版本,这个的原理是标记视频版本列表中从上到下的顺序,所以从上倒下依次如下图所示,,每个视频的版本列表都有差异,目前脚本里锁定了第二个版本也就是480p,你如果觉得不够,就把dlIcon1改成dlIcon3以获取1080p的版本。但如果这个视频没有1080p版本,那脚本会执行失败,然后跳过这个视频,进行下一个视频的下载。
代码改好以后,在左边项目文件夹上右键,选择打开命令终端。然后界面下方会有个命令行弹出来。
在上面先后输入下面两句命令,第一条是把下载源换成国内的,第二条是开始下载这个项目依赖的第三方包:
npm config set registry https://registry.npm.taobao.org/
npm install
执行时的截图如下:
结束后看到如下这种说有多少包已经被安装的提示,就说明成功了。如果有错误的话就说明没通过,这就要具体情况具体分析了。
这一步成功后代表着代码已经准备好了,下一步就可以开始运行了。
3.运行脚本。
构建好代码后,还需要核对一下你在hotbox上的下载额度是不是充足,不然执行到一半发现没流量额度了,你还得重新跑一遍脚本。
1.输入npm run dev命令,你会看到命令卡住了,这就对了,说明服务已经起来了,服务监听的是3000端口,现在就已经可以向服务发送请求了。
2.转到insomnia上,如下图设置。在地址栏上输入:http://localhost:3000/api/crawl ,在下面的body中写入一个
类似json格式的报文,报文格式如图所示,就是一个个视频编号,视频编号你可以打开B站视频的网页,从地址栏上获取,也可以在app上点分享,然后选“复制链接”得到视频号。重点提示:json报文的格式很严格,注意逗号和引号的使用,核对好后再发送请求。
核对好报文信息后,点击send按钮,然后右面会出现一个读秒,因为连接已经通了,过以小会儿你就会发现屏幕上出现了一个chrome窗口,并提示“Chrome正受到自动测试软件的控制”,然后页面上会出现登录页面,你的用户名密码会被自动填写到登录页面上,然后开始按你给的视频号逐个下载视频。
下载成功后你可以在你指定的目录下看到下载好的视频,在命令行上也有相应的日志输出。
总结:
写这篇文章之前就是想分享个脚本,没想到有这么多内容需要交代,想想毕竟是要搭建一套编程语言的编辑和执行环境,所以还是需要很多耐心和知识储备的。对于没有编程基础的朋友,可以用在这个项目上感受一下自己运行程序脚本的乐趣 ,对于有编程能力的朋友,可以给你省下一些搭建环境和琢磨API用法的时间,大家各取所需,共同进步吧,。最后强调一点,这个脚本仅针对个人少量视频的下载使用,这个脚本并没有,也不应该具有作大规模资源下载的能力。






























大妈的狗腿子
校验提示文案
rnd123
校验提示文案
Kingzeus
校验提示文案
逍遥花生
annie xxxx
校验提示文案
屎味巧克力
校验提示文案
大马金刀猴
校验提示文案
newt
校验提示文案
值友6446357497
校验提示文案
Horia
校验提示文案
老杨哥
校验提示文案
值友6282417199
校验提示文案
r_a_1-sina
校验提示文案
啥都想买的乐人
校验提示文案
值友6777613418
校验提示文案
请控制在4-20个字符
校验提示文案
some1666
校验提示文案
特拉蒙特
校验提示文案
值友_666
校验提示文案
鱼丁糸不是苏打绿
校验提示文案
系统提醒不能使用真名
校验提示文案
z00196871
校验提示文案
r_a_1-sina
校验提示文案
天天特价秒杀
校验提示文案
逍遥花生
annie xxxx
校验提示文案
值友6282417199
校验提示文案
Kingzeus
校验提示文案
老杨哥
校验提示文案
系统提醒不能使用真名
校验提示文案
Horia
校验提示文案
值友6446357497
校验提示文案
鱼丁糸不是苏打绿
校验提示文案
值友_666
校验提示文案
特拉蒙特
校验提示文案
some1666
校验提示文案
rnd123
校验提示文案
请控制在4-20个字符
校验提示文案
newt
校验提示文案
值友6777613418
校验提示文案
大马金刀猴
校验提示文案
啥都想买的乐人
校验提示文案