requests libreria example python http urllib2

libreria - urllib.urlencode python 3



Python: urllib/urllib2/httplib confusiĆ³n (8)

Estoy intentando probar la funcionalidad de una aplicación web escribiendo una secuencia de inicio de sesión en Python, pero estoy teniendo algunos problemas.

Esto es lo que necesito hacer:

  1. Haz un POST con algunos parámetros y encabezados.
  2. Seguir un redireccionamiento
  3. Recuperar el cuerpo HTML.

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

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

¿Me estoy perdiendo algo simple?

Gracias.


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


Además del hecho de que puede estar perdiendo una cookie, puede haber algunos campos en el formulario que no está PUBLICANDO en el servidor web. La mejor manera sería capturar el POST real desde un navegador web. Puede usar LiveHTTPHeaders o WireShark para husmear el tráfico e imitar el mismo comportamiento en su secuencia de comandos.


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'',{})



Pruebe twill , un lenguaje simple que permite a los usuarios navegar por la Web desde una interfaz de línea de comandos. Con sarga, puede navegar a través de sitios web que usan formularios, cookies y la mayoría de las funciones estándar de la Web. 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()


Tuve que hacer esto mismo recientemente. Solo 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")


Funkload es una gran herramienta de prueba de aplicaciones web también. Encapsula webunit para manejar la emulación del navegador, luego le ofrece características funcionales y de prueba de carga en la parte superior.


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

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

HTTPRedirectHandler doblar una instancia de HTTPRedirectHandler que HTTPRedirectHandler y seguirá los redireccionamientos.

Además, es posible que desee HTTPRedirectHandler subclase del HTTPRedirectHandler predeterminado para capturar la información que luego comprobará como parte de las pruebas de su unidad.

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

A continuación, puede usar este objeto de opener para POST y GET, manejando apropiadamente los redireccionamientos y las cookies.

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