自己编写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用法的时间,大家各取所需,共同进步吧,。最后强调一点,这个脚本仅针对个人少量视频的下载使用,这个脚本并没有,也不应该具有作大规模资源下载的能力。






























校验提示文案
校验提示文案
校验提示文案
annie xxxx
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
annie xxxx
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案