2016-12-05 3 views
0

мне нужно скачать файл из внешнего источника, я использую обычную проверку подлинности для входа в URLСкачать двоичный файл с помощью Python запрашивает модуль

import requests 
response = requests.get('<external url', auth=('<username>', '<password>')) 
data = response.json() 
html = data['list'][0]['attachments'][0]['url'] 
print (html) 
data = requests.get('<API URL to download the attachment>', auth=('<username>', '<password>'), stream=True) 
print (data.content) 

я получаю ниже выхода

<url to download the binary data> 
\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xcb\x00\x00\x1e\x00\x1e\x00\xbe\x07\x00\x00.\xcf\x05\x00\x00\x00' 

Я ожидаю, что URL-адрес загрузит документ документа в тот же сеанс.

+0

Таким образом, звуки первого шага в порядке (возвращает нужный URL-адрес). То, что вы еще не сделали, - это извлечение данных из второго ответа. «data = request.get (« », stream = True)», вероятно, должно быть чем-то вроде «data = requests.get (« », stream = True) .text "? Попробуйте это и отредактируйте вопрос, если он все еще не работает –

+1

http://docs.python-requests.org/en/master/user/advanced/#session-objects и, возможно, также передаст 'auth' во втором запросе как Что ж? – Jasper

+0

Я рекомендую вам перечитать документацию о запросах Quickstart. Чтобы получить _binary_ данные из возвращаемого объекта Response, вам необходимо получить доступ к своему атрибуту ['.content'] (http://docs.python-requests.org/en/master/user/quickstart/#binary-response-content). –

ответ

0

Если вы хотите скачать файл напрямую вы можете использовать shutil.copyfileobj():

https://docs.python.org/2/library/shutil.html#shutil.copyfileobj 

Вы уже проезжают stream=True к requests что, что вам нужно, чтобы получить файл-подобный объект обратно. Просто передайте это как источник copyfileobj().

0

Рабочий раствор

import requests 
import shutil 

response = requests.get('<url>', auth=('<username>', '<password>')) 
data = response.json() 
html = data['list'][0]['attachments'][0]['url'] 
print (html) 
data = requests.get('<url>', auth=('<username>', '<password>'), stream=True) 
with open("C:/myfile.docx", 'wb') as f: 
    data.raw.decode_content = True 
    shutil.copyfileobj(data.raw, f) 

Я могу загрузить файл, как это.

Смежные вопросы