Проблема в том, что файл сжимается в gzip, даже если это уже сжатый файл (как видно из поля 'Content-Encoding': 'gzip'
в r.headers
).
Вы используете заголовки запросов по умолчанию как для requests
, так и для wget
. По умолчанию они оба отправят что-то вроде 'Accept-Encoding: gzip, deflate'
. (Вы можете увидеть это, если распечатаете r.request.headers
.) Таким образом, сервер может легко сжать файл и отправить его обратно с заголовком 'Content-Encoding: gzip'
.
И wget
, и requests
по умолчанию обнаружат этот заголовок и прозрачно декодируют данные для вас - но вы явно указали requests
не , чтобы сделать это, и прочитали необработанные данные как есть.
Таким образом, вы в конечном итоге сохраняете файл, который представляет собой сжатый архив gzip-gzip-tarball. Очевидно, что file
сообщит, что как gzip compressed data
, а tar -z
сообщит, что находится внутри gzip does not look like a tar archive
, потому что это не так, это архив gzip tar.
Наименьшее исправление - вручную добавить headers={'Accept-Encoding': 'identity'}
к вашему запросу.
Вы можете задаться вопросом, почему сервер пытается сжать gzip-файл - только потому, что вы сказали, что может принять gzip , не означает, что вы требуете gzip, право?
Если вы посмотрите на RFC 2616 и RFC 7231 , сервер должен выбрать кодировку с наибольшим qvalue (весом), указанным клиентом, который он может поддерживать ( разрыв связи по некоторой эвристике, которая не указана). Если ваш пользовательский агент явно запрашивает 'gzip, deflate'
, предоставление вам identity
будет неправильным, если на самом деле невозможно сделать иначе, не слегка глупо.