批量下载 coursera 视频

批量下载 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>:标题的语言,可以选择 enzh-CNzh-TW
  • --download-quizzes:是否下载测验题目。
  • <video-resolution>:下载视频的分辨率,可以选择 360p540p720p。如果不指定这个参数,默认下载 540p 的视频

其中有 2 个参数需要详细说明:

第一个是 <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
2
3
4
5
6
7
--username test@qq.com
--password 123456
--subtitle-language zh-CN
--path /home/coursera
--download-quizzes
--video-resolution 720p
--cauth juLVd8F1QK2clZxGWBDE5BG-4TvfyaFzrGoKdVB6hitiAlo8bpyAGOj4n0S-eCvqKPJkS-6WSFax89AsCR5KiA.YbY_s0XZsC-lrc1r8Zf43g.2PjfIsVg2EkmKCF_PsaZAINyoNx4tDHn5re2MqoxFI34zBWL7gw93Kc7C-59c47Q8K7K_VI1rH8gpPSCvekhwRqDYqa-DsN2l8BbHrxLFUBirDBpzVdL5x586NgiCz7uzvBv5ZcLe8WWuf1_hUoZsvMmS8KpT5gs9SUZ79MNbOeGG2GabLc8JclH14_SxEKU

这时,我只需要使用 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
2
3
4
5
6
7
8
9
10
99.84.199.180   d3c33hcgiwev3.cloudfront.net
52.84.246.90 d3c33hcgiwev3.cloudfront.net
52.84.246.252 d3c33hcgiwev3.cloudfront.net
52.84.246.144 d3c33hcgiwev3.cloudfront.net
52.84.246.72 d3c33hcgiwev3.cloudfront.net
52.84.246.106 d3c33hcgiwev3.cloudfront.net
52.84.246.135 d3c33hcgiwev3.cloudfront.net
52.84.246.114 d3c33hcgiwev3.cloudfront.net
52.84.246.90 d3c33hcgiwev3.cloudfront.net
52.84.246.227 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,那么就证明可以访问了,后面可以正常下载视频。

评论