2009-06-25 11 views
5

Actualmente tengo un pequeño script que descarga una página web y extrae algunos datos que me interesan. Nada de lujos.HTTPS inicie sesión con urllib2

Actualmente estoy descarga de la página, así:

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

Aunque esto funciona perfectamente, pensé que había sentido de eliminar la dependencia de wget. Pensé que debería ser trivial convertir lo anterior en urllib2, pero hasta ahora no he tenido éxito. Internet está lleno de ejemplos de urllib2, pero no he encontrado nada que coincida con mi necesidad de autenticación HTTP simple de nombre de usuario y contraseña con un servidor HTTPS.

Respuesta

1

El módulo requests proporciona una API moderna a las capacidades de HTTP/HTTPS.

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

Si bien hubiera preferido algo en las bibliotecas estándar, esta parece ser la manera más fácil de hacerlo. –

6

this dice, debería ser sencillo

[como] siempre y cuando su Python local tiene soporte SSL.

Si usa solo Autenticación básica HTTP, debe establecer un controlador diferente, como se describe here.

Citando el ejemplo allí:

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 

Si lo hace Digest, que tendrá que establecer algunas cabeceras adicionales, pero ellos son los mismos independientemente del uso de SSL. Google para python + urllib2 + http + digest.

Saludos,

+0

Acaba de probar: Funciona para mí. – Boldewyn

+0

Disculpe, no obtuvo la parte de autenticación. Actualizaré mi respuesta en un segundo. – Boldewyn

+0

Oho, oh. Parece que tendrás que hacer un trabajo extra en urllib2: http://docs.python.org/howto/urllib2.html Básicamente, urllib2 hace la autenticación básica también a través de encabezados. Lo siento. – Boldewyn

1

La documentación urllib2 tiene un ejemplo de trabajo con la autenticación básica:

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

+0

¿Cómo sé? qué "reino" y "uri" pasar a add_password? Supongo que es obvio que no sé mucho sobre HTTP y autenticación. –

+0

Usa urllib2.HTTPPasswordMgrWithDefaultRealm, no necesita conocer el reino. El ámbito es, por lo que yo entiendo, solo una manera de que el servidor proporcione un nombre (legible por humanos) para que el área inicie sesión. Cheers, – Boldewyn

Cuestiones relacionadas