Python: urllib / urllib2 / httplib confusion

Estoy tratando de probar la funcionalidad de una aplicación web mediante la secuencia de comandos de una secuencia de inicio de sesión en Python, pero tengo algunos problemas.

Esto es lo que necesito hacer:

  1. Haga un POST con unos pocos parámetros y encabezados.
  2. Siga una redirección
  3. Recuperar el cuerpo HTML.

Ahora, soy relativamente nuevo en Python, pero las dos cosas que he probado hasta ahora no han funcionado. Primero utilicé httplib, con putrequest () (pasando los parámetros dentro de la URL), y putheader (). Esto no parece seguir las redirecciones.

Luego probé urllib y urllib2, pasando tanto encabezados como parámetros como dicts. Esto parece devolver la página de inicio de sesión, en lugar de la página a la que estoy intentando iniciar sesión, supongo que se debe a la falta de cookies o algo así.

¿Me estoy perdiendo algo simple?

Gracias.

Centrarse en urllib2 para esto, funciona bastante bien. No te metas con httplib , no es la API de nivel superior.

Lo que estás notando es que urllib2 no sigue la redirección.

HTTPRedirectHandler plegar una instancia de HTTPRedirectHandler que HTTPRedirectHandler y siga las redirecciones.

Además, es posible que desee subclasificar el HTTPRedirectHandler predeterminado para capturar información que luego verificará como parte de la prueba de su unidad.

 cookie_handler= urllib2.HTTPCookieProcessor( self.cookies ) redirect_handler= HTTPRedirectHandler() opener = urllib2.build_opener(redirect_handler,cookie_handler) 

Luego puede usar este objeto de opener para POST y GET, manejando las redirecciones y las cookies de manera adecuada.

Es posible que desee agregar su propia subclase de HTTPHandler para capturar y registrar varios códigos de error, también.

Aquí está mi opinión sobre este tema.

 #!/usr/bin/env python import urllib import urllib2 class HttpBot: """an HttpBot represents one browser session, with cookies.""" def __init__(self): cookie_handler= urllib2.HTTPCookieProcessor() redirect_handler= urllib2.HTTPRedirectHandler() self._opener = urllib2.build_opener(redirect_handler, cookie_handler) def GET(self, url): return self._opener.open(url).read() def POST(self, url, parameters): return self._opener.open(url, urllib.urlencode(parameters)).read() if __name__ == "__main__": bot = HttpBot() ignored_html = bot.POST('https://example.com/authenticator', {'passwd':'foo'}) print bot.GET('https://example.com/interesting/content') ignored_html = bot.POST('https://example.com/deauthenticator',{}) 

@ S.Lott, gracias. Tu sugerencia funcionó para mí, con algunas modificaciones. Así es como lo hice.

 data = urllib.urlencode(params) url = host+page request = urllib2.Request(url, data, headers) response = urllib2.urlopen(request) cookies = CookieJar() cookies.extract_cookies(response,request) cookie_handler= urllib2.HTTPCookieProcessor( cookies ) redirect_handler= HTTPRedirectHandler() opener = urllib2.build_opener(redirect_handler,cookie_handler) response = opener.open(request) 

Tuve que hacer esto exactamente yo mismo recientemente. Sólo necesitaba clases de la biblioteca estándar. Aquí hay un extracto de mi código:

 from urllib import urlencode from urllib2 import urlopen, Request # encode my POST parameters for the login page login_qs = urlencode( [("username",USERNAME), ("password",PASSWORD)] ) # extract my session id by loading a page from the site set_cookie = urlopen(URL_BASE).headers.getheader("Set-Cookie") sess_id = set_cookie[set_cookie.index("=")+1:set_cookie.index(";")] # construct headers dictionary using the session id headers = {"Cookie": "session_id="+sess_id} # perform login and make sure it worked if "Announcements:" not in urlopen(Request(URL_BASE+"login",headers=headers), login_qs).read(): print "Didn't log in properly" exit(1) # here's the function I used after this for loading pages def download(page=""): return urlopen(Request(URL_BASE+page, headers=headers)).read() # for example: print download(URL_BASE + "config") 

Le daría una oportunidad a Mechanize ( http://wwwsearch.sourceforge.net/mechanize/ ). Bien puede manejar sus cookies / encabezados de forma transparente.

Try twill : un lenguaje simple que permite a los usuarios navegar por la Web desde una interfaz de línea de comandos. Con la sarga, puede navegar por los sitios web que utilizan formularios, cookies y la mayoría de las funciones web estándar. Más al punto, twill está escrito en Python y tiene una API de python , por ejemplo:

 from twill import get_browser b = get_browser() b.go("http://www.python.org/") b.showforms() 

Además del hecho de que puede estar perdiendo una cookie, puede haber algunos campos en el formulario que usted NO ESTÁ ENVIANDO al servidor web. La mejor manera sería capturar el POST real desde un navegador web. Puede usar LiveHTTPHeaders o WireShark para detectar el tráfico e imitar el mismo comportamiento en su script.

Funkload es una gran herramienta de prueba de aplicaciones web también. Se ajusta a la unidad web para manejar la emulación del navegador, y luego le brinda funciones funcionales y de prueba de carga en la parte superior.