如何下载Google Drive中的超大型文件
本文将对「如何下载Google Drive中的超大型文件?」这一问题展开探索和解决。
太长不读:直接看这里
情景与问题
在AI、系统安全等研究领域,一项研究成果的产生需要大量的数据样本进行训练和分析,而很多国外作者会倾向于在Google Drive上分享自己的数据集。但是,Google Drive只会为每个下载链接保留一小时的有效期,即你会在Google Drive上的下载链接中会发现一个token字段,而这个字段的有效期是1小时。这一机制使得你必须在1小时内下载好你的文件,否则时机一到,token刷新,当前下载会话就会失效。如果无法有效实现断点续传的话,你就得从头下载了。
那么,在国内的网络环境下,是否有方案可以帮助我们有效实现从Google Drive上下载几十GB乃至更大的文件呢?
候选解决方案
解决上述问题的核心点在于:要么具有下载带宽足够的网络服务,要么可以实现对Google Drive的有效断点续传。因此,可以有以下候选的解决方案:
- 浏览器直接下载
- Google Drive Desktop 客户端下载
- 第三方下载软件(如IDM、CyberDuck等)
- 用国外服务器下载后作为中转,设法下载到国内本地
以上候选解决方案我都试了一遍,在面对70GB大文件时,只有最后一个方法是奏效的。而在介绍这种方法之前,首先介绍前三种方法在目前Google Drive下载机制及国内网络环境下失败的原因。
浏览器直接下载
直接用Chrome下载(开启硬件加速、多线程),如下图所示。
此时,下载速度将主要取决于你的代理服务器带宽、Chrome下载策略等i因素,而我这个速度对于下载70GB的大文件而言是远远不够的。
因此,一个小时后,下载失败了。
Google Drive Desktop 客户端
在我寻找其他解决方法时,发现有人提到使用 Back up & Sync 这款软件可以实现Google Drive下载的断点续传。而在2021年这款软件已经正式成为了Google Drive Desktop。下载并安装完后,这款Google Drive的客户端似乎是一个半成品,在本地你甚至无法直接浏览云端存储的内容,如下图所示。
整个软件只有一个空荡荡的下载状态(所谓的同步状态),你想下载Drive中的某个文件时,只能使用搜索功能查找你想要的文件。这甚至都不如国内的一些云盘客户端的体验。总之,在搜索到我想“同步”到本地的大文件后,点击文件名自动开始下载。
令人惊喜的是,客户端的下载速度平均可以达到8MB/s(虽然有些不稳定)。然而,一个小时后,下载再一次的失效了,此时我本以为重新点击文件就能实现断点续传,可惜客户端还是从头给我下载。翻阅了产品文档和他人经验后,我依然没能找到断点续传的功能,不知这是我自己的原因,还是这个软件从Back up & Sync 改进而来后,居然不支持自家Drive的断点续传了?
总之,Google Drive Desktop给我一种软件工业半成品的感觉,用户体验真的非常糟糕。
第三方下载软件
在很多多线程下载器、SFTP下载器等第三方下载软件中,我尝试了著名的IDM。当IDM接管Google Drive的下载链接时,也只能达到2-4MB/s的下载速度,如下图所示;不过没关系,选用IDM的原因之一就是据说它可以实现Google Drive的断点续传。
当下载一个小时后,IDM虽然同样会告诉用户当前下载链接已失效,但是当你尝试让IDM进行链接重定向时,它会要求你再在Drive中手动下载一下,如下图所示。这样一来,它就又可以接管新的下载链接了。而且惊喜的是,IDM的确可以实现对新下载链接的断点续传。
但是在我测试IDM之时, 我已多次尝试下载该文件了。Google Drive以 此文件已超出下载限制的原因 拒绝让我重新下载。因此,尽管IDM在断点续传时能重定向链接并以一个不错的速度接管,但此时的我们不得不寻找一个新的方法。
有效的解决方案
最终,我们只能寄希望于寻找具有足够带宽的国外主机,使用其下载大文件后,设法转移到国内本地。这种做法虽然有些繁琐,但只要文件能成功下载到我们能控制的主机中,想再对其进行各种操作就不会有限制了。
申请Vultr主机
Vultr主机的一大优势在于它的主机带宽据说非常不错,同时它支持支付宝缴费,而且扣费方式是按照小时收费的。因此,从你创建一个主机的docker实例,到结束任务销毁这个实例的过程中,通常只花费不到1$的价格就足够了,这便于我们在上面进行一些临时性的任务和实验。
进入Vultr官网,登录后在Deploy中依次选择购买的主机地点、系统、存储空间等配置。此处要记得根据目标文件的大小选择一个空间充足的方案,这里我选择了150GB存储的配置,如下图所示。
在充值(无需充太多,$10即可)并启动之后,我们需要在当前这个主机实例中通过命令行的方式下载Google Drive中的文件。
获取Oauth API Key
Google作为一个API狂魔,自然也提供了Google Drive文件下载的Oauth API。可通过如下步骤实现Drive API的申请,并在命令行中进行文件的下载。
在Oauth 2.0中,选择Drive API v3下的 https://www.googleapis.com/auth/drive.readonly,如下图所示。
选择 Authorize API,并选择 Exchange authorization code for tokens 就可以申请到一个新的Drive API 下载用 Access Token,这一token的有效期同样为1小时。
记得将该 Access Token 复制保存出来,以便下一步使用。
下载至Vultr主机
下面我们使用curl在命令行中下载Drive中的文件。
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" https://www.googleapis.com/drive/v3/files/YOUR_FILE?alt=media -o OUTPUT_FILE
其中有三个需要自己填写字段:
- YOUR_ACCESS_TOKEN: 填写我们刚申请的token即可
- YOUR_FILE: 在Drive右击要下载的文件, 选择 获取链接, 将链接的后半部分填入即可, 如下图所示.
- OUTPUT_FILE: 下载要输出的文件名, 随意填写即可; 如果是断点下载, 记得保持文件名一致.
运行命令开始下载。可以看到,海外Vultr主机的直连Drive的带宽非常可观,平均速度居然可以达到100MB/s左右。这一速度下载70GB的文件也只需要十几分钟。
因此,使用国外主机是完全可以有效下载Google Drive中的大文件的,1小时的极限可以下载400GB左右的文件,而且可以使用curl -C实现断点续传,由此理论上能实现任意大文件的有效下载。
下载至国内主机
此时文件已成功下载至我们能控制的一个主机了,我们可设法将其二次下载至国内的本地服务器。而Vultr的主机带宽已经充分证明了它网络服务的可靠性。因此,可以在Vultr主机上架设nginx,并直接将该大文件使用http服务发布在公网上,通过nginx + http的文件下载服务,在国内本地主机上使用IDM等第三方软件加速下载。
在Vultr上直接 apt install nginx 安装nginx,安装记得在Vultr主机上使用如下命令关闭防火墙。启动服务如下所示。
sudo ufw app list sudo ufw allow 'Nginx Full'
在设置之后,可以直接将我们的bodmas.zip这一大文件移动到Debian的nginx Web根目录(/var/www/html)下。之后,本地直接访问 http://my_vultr_ip/bodmas.zip ,让IDM接管下载,即可看到此时的下载速度基本也能达到70MB/s,而且不会有下载时间限制。
最终,这一70GB的数据集文件,几经转折终于抵达了我们自己的电脑中。而我们Vultr主机也可以直接destroy掉,此时只花了1$不到,余额可以先放着以备他用。
遗留问题
Google Drive Desktop的使用:这个软件的用户体验实在是太差了,但它毕竟是Google Drive的官方客户端,因此上文中我的失败经验有没有可能只是我的打开方式不对,但软件本身其实是支持断点续传的?
CyberDuck的断点续传:CyberDuck也是一款非常出名的第三方下载软件,它可以连接许多产品的文件下载服务。但由于在没有license的条件下,是无法连接至Google Drive的。因此CyberDuck是否能做到比IDM更强大、更高效的断点续传?这一结果可能需要他人来进一步测试了。
总结
以上成功的方案可以基本总结成下面的5步:
- 申请一个带宽可靠、存储足够的海外主机(推荐Vultr);
- 申请Google Drive的Oauth API Key (获得 Access Token);
- 使用curl -C 下载目标文件至海外主机;
- 在海外主机上架设nginx,设置防火墙,并将目标文件移动至根目录;
- 本地使用IDM等多线程下载工具,在海外主机的Web服务中接管目标文件的下载。
诚然,直接使用IDM接管并断点续传这一方案在特定条件下也是可以成功的,但终究没有直接使用最后一种方法的下载速度快而且省心。在经过简单的配置之后,我们基本可以下载Google Drive中任意的超大型文件了。
最后,感谢你的阅读,欢迎给出建议或者其他更高效的方法。以一句歌词作为结束: