Как скачивать файлы из Google Drive без головной боли и ограничений
Знакомая ситуация: вам нужно скачать большой датасет или архив с Google Drive прямо на сервер через терминал. Вы копируете ссылку, подставляете её в wget или curl, запускаете... и получаете либо пустой HTML-файл с предупреждением о проверке на вирусы, либо ошибку доступа. Google Drive не очень любит, когда к нему обращаются автоматизированные скрипты, особенно если файл весит больше пары сотен мегабайт.
Конечно, можно возиться с официальным API, настраивать OAuth2, создавать сервисные аккаунты и прописывать токены. Но что, если вам нужно просто скачать публичный файл здесь и сейчас? Именно для таких случаев существует gdown — инструмент, который делает скачивание с «Диска» таким же простым, каким оно должно быть изначально.
Что такое gdown и почему он лучше стандартных утилит
gdown — это легковесная утилита на Python, специально заточенная под работу с публичными ссылками Google Drive. В то время как обычные загрузчики пасуют перед защитными механизмами Google, gdown умеет их элегантно обходить.
Главная проблема curl и wget при работе с Google Drive заключается в промежуточной странице безопасности. Когда файл большой, Google не может проверить его на вирусы и просит пользователя подтвердить скачивание вручную. gdown имитирует поведение браузера, автоматически «нажимает» на нужные кнопки и пробрасывает сессионные куки, чтобы загрузка началась без вашего участия.
Ключевые возможности, которые упрощают жизнь
Инструмент не ограничивается простым скачиванием одного файла. Вот несколько фишек, которые делают его незаменимым в арсенале DevOps-инженера или Data Scientist'а:
- Обход предупреждений безопасности. Как я уже упоминал, это киллер-фича. Большие файлы (от 100 МБ и выше) скачиваются одной командой без лишних вопросов.
- Скачивание папок целиком. По умолчанию Google Drive не дает скачать папку без архивации в ZIP через веб-интерфейс.
gdownумеет рекурсивно обходить содержимое папки (до 50 файлов) и скачивать их по отдельности. - Конвертация документов на лету. Если у вас есть ссылка на Google Doc, таблицу или презентацию, вы можете указать желаемый формат (PDF, CSV, XML), и утилита сама запросит нужную версию.
- «Умное» извлечение ID. Вам не обязательно вырезать ID файла из длинной ссылки вручную. Флаг
--fuzzyпозволяет скормить утилите практически любую ссылку на документ, и она сама поймет, что именно нужно забрать.
Как это работает на практике
Установка максимально стандартная для Python-мира:
pip install gdown
Примеры использования в терминале
Допустим, у нас есть ID файла. Скачать его можно максимально коротко:
gdown 1l_5RK28JRL19wpT22B-DY9We3TVXnnQQ
Если же у вас есть полная ссылка из браузера, просто добавьте флаг --fuzzy, чтобы не мучиться с регулярками:
gdown --fuzzy 'https://drive.google.com/file/d/0B9P1L--7Wd2vNm9zMTJWOGxobkU/view?usp=sharing'
А если нужно забрать целую папку в конкретную директорию:
gdown https://drive.google.com/drive/folders/15uNXeRBIhVvZJIhL4yTw4IsStMhUaaxl -O /tmp/my_folder --folder
Использование в Python-скриптах
Для тех, кто пишет пайплайны обработки данных, gdown предоставляет удобный интерфейс внутри кода. Это гораздо чище, чем вызывать subprocess.run(['wget', ...]).
import gdown
# Скачиваем файл и сразу проверяем его хеш-сумму
url = "https://drive.google.com/uc?id=1l_5RK28JRL19wpT22B-DY9We3TVXnnQQ"
output = "model_weights.npz"
md5 = "md5:fa837a88f0c40c513d975104edf3da17"
gdown.cached_download(url, output, hash=md5, postprocess=gdown.extractall)
Обратите внимание на cached_download: функция не будет качать файл заново, если он уже есть на диске и его MD5 совпадает. А параметр postprocess позволяет, например, автоматически распаковать архив сразу после загрузки.
Когда всё идет не по плану: решаем проблемы с доступом
Иногда даже gdown может выдать ошибку Permission Denied. Обычно это происходит по двум причинам:
- Файл не публичный. Убедитесь, что в настройках доступа на Google Drive выбрано «Все, у кого есть ссылка».
- Лимиты Google. Если файл слишком популярен, Google временно ограничивает к нему доступ.
Интересный лайфхак от разработчика: если файл открывается в браузере, но не качается через CLI, можно экспортировать куки из браузера (например, через расширение "Get cookies.txt LOCALLY") и положить их в ~/.cache/gdown/cookies.txt. После этого gdown подхватит вашу сессию и скачивание пойдет как по маслу.
Кому это пригодится?
В моей практике gdown чаще всего выручает в двух сценариях:
- ML-инженеры: когда нужно быстро подтянуть веса предобученной модели в Docker-контейнер или на удаленный сервер.
- Автоматизация бэкапов и отчетов: если ваши коллеги-менеджеры ведут таблицы в Google Sheets, а вам нужно забирать их в формате CSV для обработки скриптами.
gdown — это классический пример утилиты, которая делает одну вещь, но делает её превосходно. Она избавляет от необходимости возиться с тяжеловесными SDK и API, когда задача стоит максимально просто: «дай мне этот файл».
Если вы часто работаете с облачными хранилищами через консоль, этот инструмент определенно заслуживает места в вашем requirements.txt или списке установленных пакетов. Попробовать проект можно на GitHub — у него уже более 5 тысяч звезд, что говорит о признании сообществом.
А как вы обычно решаете проблему скачивания файлов из облака на сервер? Пользуетесь официальными CLI или ищете обходные пути? Поделитесь своим опытом в комментариях!
