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:
- Haz un POST con algunos parámetros y encabezados.
- Seguir un redireccionamiento
- 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'',{})
Le daría a Mechanize ( http://wwwsearch.sourceforge.net/mechanize/ ) una oportunidad. Puede manejar sus cookies / encabezados de forma transparente.
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.