Сохранить файл, полученный по HTTP GET - PullRequest
2 голосов
/ 16 октября 2019

У меня есть API, из которого я могу получить файлы. Я делаю это, используя urllib3 в python.

например,

url = "https://example.com/api/files/13"
r = http.request('GET', url, headers=headers)

, где заголовки содержат информацию для аутентификации.

При декодировании всех данных в ответе получите тот же результат, что и следовало ожидать. Я подтвердил это с помощью ответа в информационном терминале сети моего браузера:

load = json.loads(r.data.decode('utf-8'))
data = load['data']

data на данном этапе представляет собой длинную строку, содержащую символы, цифры и внешний вид, в зависимости от файла, аналогично dG0seHJheSxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfRGV0X3BvcyxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfRGV0X3ZlbCxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfRGV0X2FjYyxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfUm5nX3BvcyxtZWRQaG90b24uU04yMDE2LUlSMDA3LkltUmlfUm5nX3ZlbCxtZWRQaG90b..., продолжая после точек. Но это всего лишь CSV-файл.

Единственная проблема, с которой я сталкиваюсь сейчас, - это сохранение данных на диске. До сих пор я пытался:

with open(dst_file, 'wb') as out_file:
    out_file.write(data)

Вместо outfile.write(...) Я также пытался shutil.copyfileobj(r, out_file), но тоже не работает.

Я думаю, это зависит от представленияДанные у меня есть. Я думаю, что иметь его в виде строки не очень полезно. Но как его сохранить?

РЕДАКТИРОВАТЬ: Одна вещь, которую, возможно, следует отметить: URL-адрес API не содержит файл, поэтому вызов будет перенаправлен. Я попытался сделать это с другим файлом из Интернета, здесь я сразу же получил нужные данные при доступе к >> r.data.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Проблема была немного другой. Я не знал, как данные были закодированы и даже были (честно говоря, я не ожидал, что небольшой CSV будет закодирован).

Использование восстановленных данных и их декодирование с помощью base64 решило проблему в этомопределенный случай.

import base64
...
data_str = base64.b64decode(load["data"])
...
0 голосов
/ 16 октября 2019

Если вы используете запросы, вы можете добавить флаг allow_redirects=True, который может помочь. В urllib3 вы можете управлять этим поведением, устанавливая количество повторов. Я не знаком с этим, поэтому я просто оставлю ссылку на него.

Просто CTRL + F для перенаправления!

https://urllib3.readthedocs.io/en/latest/user-guide.html

...