1. 程式人生 > 其它 >如何用Google Drive下載超大型檔案

如何用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步:

  1. 申請一個頻寬可靠、儲存足夠的海外主機(推薦Vultr);
  2. 申請Google Drive的Oauth API Key (獲得 Access Token);
  3. 使用curl -C 下載目標檔案至海外主機;
  4. 在海外主機上架設nginx,設定防火牆,並將目標檔案移動至根目錄;
  5. 本地使用IDM等多執行緒下載工具,在海外主機的Web服務中接管目標檔案的下載。

誠然,直接使用IDM接管並斷點續傳這一方案在特定條件下也是可以成功的,但終究沒有直接使用最後一種方法的下載速度快而且省心。在經過簡單的配置之後,我們基本可以下載Google Drive中任意的超大型檔案了。

最後,感謝你的閱讀,歡迎給出建議或者其他更高效的方法。以一句歌詞作為結束:

“即使只相隔著塊紙,相親必須同時同意” ——容祖兒《牆紙》