Какие библиотеки использовать для скачивания файлов в Python
Что проверяют
Умеете ли вы скачать файл так, чтобы это работало в проде: без загрузки всего ответа в память, с таймаутами, повторами и проверкой результата. Следом обычно просят показать скачивание файла на несколько гигабайт или параллельную загрузку сотни файлов.
Как отвечать
Назовите инструменты и сразу их нишу:
requests: стандарт для синхронного кода. Для больших файловrequests.get(url, stream=True, timeout=(5, 30)), затемiter_content(chunk_size=1024 * 1024)и запись кусками. Сразуraise_for_status(), иначе в файл запишется страница ошибки;urllib.request: стандартная библиотека без зависимостей.urlopenплюсshutil.copyfileobjвполне годятся для скриптов, аurlretrieveотносится к устаревшему интерфейсу;httpx: API как уrequests, но есть синхронный и асинхронный клиент и опционально HTTP/2. Потоковое чтение черезclient.stream("GET", url)иiter_bytes(), таймаут по умолчанию 5 секунд;aiohttp: асинхронная загрузка множества файлов, число одновременных запросов ограничиваютasyncio.Semaphore;boto3: для S3-совместимых хранилищ,download_fileсам качает большой объект частями в несколько потоков;- пакет
wget: встречается в туториалах, но давно не обновляется, в новом коде его не берут.
Дальше инженерные детали. Повторы через HTTPAdapter с urllib3.util.Retry или библиотеку tenacity, с экспоненциальной задержкой. Докачка через заголовок Range и ответ 206 Partial Content, если сервер его поддерживает. Контрольная сумма считается на лету: hashlib.sha256 обновляется каждым куском. Файл пишется во временный и переименовывается через os.replace, чтобы никто не прочитал недокачанный.
Где спотыкаются
Не ставят таймаут. У requests его нет по умолчанию, и зависшее соединение держит процесс бесконечно.
Пишут response.content для большого файла. Весь ответ оказывается в памяти, и на гигабайтном файле процесс падает. Нужен stream=True.
Берут имя файла из URL или заголовка Content-Disposition как есть. Туда может прийти путь с ../, и файл запишется вне целевого каталога, поэтому имя очищают или генерируют сами.