批量下载 coursera 视频
coursera 是一个著名的在线学习平台。
我在这个平台上学习了很多课程,包括 Andrew 的 DeepLearning 系列、TensorFlow 系列,和其他的一些 深度学习课程。
然而这个网站需要翻墙才能够访问。因此我希望把视频都下载到本地。
虽然 coursera 本身提供了视频下载选项,但是只能一个一个视频手动下载,不方便管理。
这篇文章介绍一个能够批量下载 coursera 视频的工具:coursera-dl,地址是:https://github.com/coursera-dl/coursera-dl。
首先,进入你的 Python 虚拟环境,例如我的 Python 虚拟环境名字是 coursera
:
1 | activate coursera |
然后安装 coursera-dl
:
1 | pip install coursera-dl |
然后使用如下命令下载你所需要的课程。
1 | coursera-dl -u <user> -p <password> --cauth <cauth-cookie> --path <path> --subtitle-language <language> --download-quizzes --video-resolution <video-resolution> <course-name> |
参数解释如下:
- <user>:登录 coursera 的用户名
- <password>:登录 coursera 的密码
- <cauth-cookie>:coursera 网站的 cookie
- <course-name>:你想下载的课程名称
- <path>:下载课程存放的路径,如果不指定,默认下载到当前文件夹
- <language>:标题的语言,可以选择
en
、zh-CN
、zh-TW
--download-quizzes
:是否下载测验题目。- <video-resolution>:下载视频的分辨率,可以选择
360p
、540p
、720p
。如果不指定这个参数,默认下载540p
的视频
其中有 2 个参数需要详细说明:
<cauth-cookie>
第一个是 <cauth-cookie>
。这个参数需要在浏览器中查看。下面是用 Google 浏览器示范。
首先打开 coursera.org 并登录。
打开浏览器的设置。
选择
隐私设置和安全性 -> Cookie 及其他网站数据
选择
查看所有 Cookie 和网站数据
搜索
coursera.org
,并打开。可以看到
CAUTH
。
注意,CAUTH
参数每次登录都会变化,过一段时间也可能会变化。因此,我们每次下载课程之间,都要到浏览器查看最新的 CAUTH
参数,使用最新的 CAUTH
参数来下载课程。
<course-name>
这个参数是课程名称,必须非常精确,通常包含在课程主页的链接中。
课程名称 <course-name>
的形式如下 :
1 | https://www.coursera.org/learn/<course-name>/home/welcome |
例如打开某个课程的主页,查看 URL。
1 | https://www.coursera.org/learn/introduction-tensorflow/home/welcome |
那么 introduction-tensorflow
就是课程名称。
例子
假设我想要下载 introduction-tensorflow
,用户名是 test@gmail.com
,密码是 123456
,想要保存的路径是 /home/coursera
。
完整命令如下:
1 | coursera-dl -u test@gmail.com -p 123456 --path /home/coursera --cauth juLVd8F1QK2clZxGWBDE5BG-4TvfyaFzrGoKdVB6hitiAlo8bpyAGOj4n0S-eCvqKPJkS-6WSFax89AsCR5KiA.YbY_s0XZsC-lrc1r8Zf43g.2PjfIsVg2EkmKCF_PsaZAINyoNx4tDHn5re2MqoxFI34zBWL7gw93Kc7C-59c47Q8K7K_VI1rH8gpPSCvekhwRqDYqa-DsN2l8BbHrxLFUBirDBpzVdL5x586NgiCz7uzvBv5ZcLe8WWuf1_hUoZsvMmS8KpT5gs9SUZ79MNbOeGG2GabLc8JclH14_SxEKU --subtitle-language zh-CN --download-quizzes --video-resolution 720p introduction-tensorflow |
使用配置文件
但是上面的方法,每次都要在命令行中输入用户名、密码、下载路径等参数,比较繁琐,我们可以把参数写入到 coursera-dl.conf
配置文件中。如果我把上面的参数写入 coursera-dl.conf
,如下:
1 | --username test@qq.com |
这时,我只需要使用 coursera-dl introduction-tensorflow
就可以下载这个课程。
注意 coursera-dl.conf
需要在当前命令运行的路径下,才能生效。
后台下载
由于下载可能会很慢,因此可以使用后台挂机下载。命令如下:
1 | nohup coursera-dl introduction-tensorflow > coursera.log 2>&1 & |
断点续传
如果下载过程中突然断电导致下载中断。
那么重启之后,可以使用 --resume
参数从上次中断的地方恢复下载。命令如下:
1 | coursera-dl --resume introduction-tensorflow |
后台下载如下:
1 | nohup coursera-dl --resume introduction-tensorflow > coursera.log 2>&1 & |
更多参数解释,请参考官方文档:https://github.com/coursera-dl/coursera-dl。
下载失败
由于 coursera 是国外的网站,因此经常会连接超时,下载失败。
经常会报下面的错误:
1 | urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='d3c33hcgiwev3.cloudfront.net', port=443): Max retries exceeded with url: /imageAssetProxy.v1/TvxoI4ZUEemNChIBV74tfA_d4ffd687ff1ef9c4905412071f1cfc0f_Screen-Shot-2019-06-03-at-4.06.43-PM.png?expiry=1602460800000&hmac=au4hUFENj973KUt0PyUozVQXH79sIRUsQcKal4f1BBk (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001EEAA03C2B0>: Failed to establish a new connection: [WinError 10060] 由于连 接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。',)) |
上面错误信息是指连接不上 d3c33hcgiwev3.cloudfront.net,这个链接是 coursera 的视频服务器。
我们直接执行 ping d3c33hcgiwev3.cloudfront.net
,可以看到是失败的。
解决方法是修改本机的 hosts
文件,配置这个链接对应的 IP 地址。
现在给出如下的多个 IP 地址的配置:
1 | 99.84.199.180 d3c33hcgiwev3.cloudfront.net |
注意你只需要选择一行,添加到 hosts
文件中。即使你将上面所有的配置都添加了,hosts
运行之后只会读取第一个配置。
Windows
在 Windows 中,
hosts
文件路径是C:\Windows\System32\drivers\etc\hosts
。修改后,CMD 运行
ipconfig/flushdns
清除 DNS 缓存。Mac
在 Mac 中,
hosts
文件路径是/etc/hosts
。然后在终端执行
sudo killall -HUP mDNSResponder
清除 DNS 缓存。如果失败了,则执行
sudo discoveryutil udnsflushcaches
清除 DNS 缓存。Linux
在 Linux 中,
hosts
文件路径是/etc/hosts
。然后重启,即可清除 DNS 缓存。
截止目前为止(2020年10月10号),依然有用的 IP 是 99.84.199.180 d3c33hcgiwev3.cloudfront.net
。
配置好 hosts
文件后,在终端执行 ping d3c33hcgiwev3.cloudfront.net
:
可以看到 ping 成功了,并且 IP 也是我们刚刚配置的 IP,那么就证明可以访问了,后面可以正常下载视频。