2015-11-02 72 views
8

Sto scrivendo uno script python, che salverà il file pdf localmente in base al formato indicato nell'URL. per es.Come scaricare file pdf su https con python

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

sto aprendo questo URL tramite script python:

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

L'url contiene un sacco di immagini e testo. Una volta aperto questo URL, voglio salvare un file in formato pdf usando lo script python.

Questo è quello che ho fatto finora.
Codice 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() 

Codice 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() 

In precedenza il codice sto ottenendo: urllib2.HTTPError: Errore HTTP 401: non autorizzato

Se uso il codice 2, come può ho passato i dettagli dell'autorizzazione?

+0

Vuoi una soluzione che utilizza 'webbrowser.open',' requests.get', o 'urllib2. urlopen'? –

+0

@ Robᵩ - Ho provato sopra gli approcci. Quindi richieste o urllib2 qualsiasi cosa funzionerà. –

risposta

5

Penso che questo funzionerà

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)  
0

Si può provare qualcosa di simile:

import requests 
response = requests.get('https://websitewithfile.com/file.pdf',verify=False, auth=('user', 'pass')) 
with open('file.pdf','w') as fout: 
    fout.write(response.read()): 
+0

'response.text' è probabilmente una scelta sbagliata, poiché implica un passo di decodifica. Magari aprire il file con 'wb' e scrivere' response.content' invece. –

+1

response.raw Penso che –

+0

A quanto pare, 'response.iter_chunk' è il" metodo preferito e consigliato per richiamare un documento "di' request': http://docs.python-requests.org/en/latest/user/quickstart/# raw-response-content –