2009-06-25 22 views
5

Attualmente ho un piccolo script che scarica una pagina web ed estrae alcuni dati a cui sono interessato. Niente di particolare.HTTPS accedi con urllib2

Attualmente sto scaricando la pagina in questo modo:

import commands 
command = 'wget --output-document=- --quiet --http-user=USER --http-password=PASSWORD https://www.example.ca/page.aspx' 
status, text = commands.getstatusoutput(command) 

Anche se questo funziona perfettamente, ho pensato che sarebbe dare un senso di rimuovere la dipendenza da wget. Ho pensato che sarebbe stato banale convertire il precedente in urllib2, ma finora non ho avuto successo. Internet è pieno di esempi di urllib2, ma non ho trovato nulla che corrisponda al mio bisogno di un semplice username e password di autenticazione HTTP con un server HTTPS.

risposta

1

Il modulo requests fornisce un'API moderna per HTTP/HTTPS capacità.

import requests 

url = 'https://www.someserver.com/toplevelurl/somepage.htm' 

res = requests.get(url, auth=('USER', 'PASSWORD')) 

status = res.status_code 
text = res.text 
+0

Anche se avrei preferito qualcosa nelle librerie standard, questa sembra la via più ovvia da fare. –

6

this dice, dovrebbe essere semplice

[come] fino a quando il Python locale ha il supporto SSL.

Se si utilizza solo l'autenticazione di base HTTP, è necessario impostare un gestore diverso, come descritto here.

Citando l'esempio c'è:

import urllib2 

theurl = 'http://www.someserver.com/toplevelurl/somepage.htm' 
username = 'johnny' 
password = 'XXXXXX' 
# a great password 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
# this creates a password manager 
passman.add_password(None, theurl, username, password) 
# because we have put None at the start it will always 
# use this username/password combination for urls 
# for which `theurl` is a super-url 

authhandler = urllib2.HTTPBasicAuthHandler(passman) 
# create the AuthHandler 

opener = urllib2.build_opener(authhandler) 

urllib2.install_opener(opener) 
# All calls to urllib2.urlopen will now use our handler 
# Make sure not to include the protocol in with the URL, or 
# HTTPPasswordMgrWithDefaultRealm will be very confused. 
# You must (of course) use it when fetching the page though. 

pagehandle = urllib2.urlopen(theurl) 
# authentication is now handled automatically for us 

Se lo fai Digest, dovrete impostare alcune intestazioni supplementari, ma sono gli stessi indipendentemente utilizzo di SSL. Google per python + urllib2 + http + digest.

Cheers,

+0

Appena testato: funziona per me. – Boldewyn

+0

Siamo spiacenti, non ha ottenuto la parte di autenticazione. Aggiornerò la mia risposta tra un secondo. – Boldewyn

+0

Oho, oh. Sembra che dovrai fare un lavoro extra in urllib2: http://docs.python.org/howto/urllib2.html In sostanza, urllib2 esegue l'autenticazione di base anche tramite le intestazioni. Scusate. – Boldewyn

1

La documentazione urllib2 ha un esempio di lavorare con l'autenticazione di base:

http://docs.python.org/library/urllib2.html#examples

+0

Come faccio a sapere quale "regno" e "uri" passare a add_password? Immagino sia ovvio che non conosco molto su HTTP e autenticazione. –

+0

Usa urllib2.HTTPPasswordMgrWithDefaultRealm, non è necessario conoscere il realm. Il regno è, per quanto ho capito, solo un modo del server per fornire un nome (leggibile dall'uomo) per l'area in cui effettuare l'accesso. Saluti, – Boldewyn