本文將對「如何下載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中任意的超大型文件了。
最后,感謝你的閱讀,歡迎給出建議或者其他更高效的方法。以一句歌詞作為結束: