it-swarm.com.ru

Как мне скачать PDF-файл через HTTPS с Python

Я пишу скрипт на Python, который будет сохранять файл PDF локально в соответствии с форматом, указанным в URL. например, 

https://Hostname/saveReport/file_name.pdf   #saves the content in PDF file.

Я открываю этот URL через скрипт Python: 

 import webbrowser
 webbrowser.open("https://Hostname/saveReport/file_name.pdf")  

URL содержит много изображений и текста. Как только этот URL открыт, я хочу сохранить файл в формате PDF, используя скрипт Python.

Это то, что я сделал до сих пор.
Код 1:

import requests
url="https://Hostname/saveReport/file_name.pdf"    #Note: It's https
r = requests.get(url, auth=('usrname', 'password'), verify=False)
file = open("file_name.pdf", 'w')
file.write(r.read())
file.close()

Код 2:

 import urllib2
 import ssl
 url="https://Hostname/saveReport/file_name.pdf"
 context = ssl._create_unverified_context()
 response = urllib2.urlopen(url, context=context)  #How should i pass authorization details here?
 html = response.read()

В приведенном выше коде я получаю: urllib2.HTTPError: Ошибка HTTP 401: неавторизованный 

Если я использую код 2, как я могу передать данные авторизации?

10
user3439895

Я думаю, что это будет работать

import requests
url="https://Hostname/saveReport/file_name.pdf"    #Note: It's https
r = requests.get(url, auth=('usrname', 'password'), verify=False,stream=True)
r.raw.decode_content = True
with open("file_name.pdf", 'wb') as f:
        shutil.copyfileobj(r.raw, f)      
7
Joran Beasley

Один из способов сделать это:

import urllib3
urllib3.disable_warnings()
url = r"https://websitewithfile.com/file.pdf"
fileName = r"file.pdf"
with urllib3.PoolManager() as http:
    r = http.request('GET', url)
    with open(fileName, 'wb') as fout:
        fout.write(r.data)
0
baji

Для некоторых файлов - по крайней мере, tar-архивов (или даже всех других файлов) вы можете использовать pip:

import sys
from subprocess import call, run, PIPE
url = "https://blabla.bla/foo.tar.gz"
call([sys.executable, "-m", "pip", "download", url], stdout=PIPE, stderr=PIPE)

Но вы должны подтвердить, что загрузка прошла успешно другим способом, так как pip вызовет ошибку для любых файлов, которые не являются архивами, содержащими setup.py, следовательно, stderr = PIPE (Или вы можете определить, была ли загрузка успешной, анализируя сообщение об ошибке подпроцесса ).

0
Peter Zagubisalo