2011-01-03 23 views
22

Estoy intentando abrir el siguiente sitio web y recuperar la cookie inicial y usarla para la segunda url-open PERO si ejecuta el siguiente código, genera 2 cookies diferentes. ¿Cómo uso la cookie inicial para la segunda url-open?Python - urllib2 y cookielib

import cookielib, urllib2 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 

home = opener.open('https://www.idcourts.us/repository/start.do') 
print cj 

search = opener.open('https://www.idcourts.us/repository/partySearch.do') 
print cj 

salida muestra 2 galletas diferente cada vez que se puede ver:

<cookielib.CookieJar[<Cookie JSESSIONID=0DEEE8331DE7D0DFDC22E860E065085F for www.idcourts.us/repository>]> 
<cookielib.CookieJar[<Cookie JSESSIONID=E01C2BE8323632A32DA467F8A9B22A51 for www.idcourts.us/repository>]> 

Respuesta

21

Esto no es un problema con urllib. Ese sitio hace algunas cosas funky. Es necesario para solicitar un par de hojas de estilo para que pueda validar su id de sesión:

import cookielib, urllib2 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
# default User-Agent ('Python-urllib/2.6') will *not* work 
opener.addheaders = [ 
    ('User-Agent', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11'), 
    ] 


stylesheets = [ 
    'https://www.idcourts.us/repository/css/id_style.css', 
    'https://www.idcourts.us/repository/css/id_print.css', 
] 

home = opener.open('https://www.idcourts.us/repository/start.do') 
print cj 
sessid = cj._cookies['www.idcourts.us']['/repository']['JSESSIONID'].value 
# Note the += 
opener.addheaders += [ 
    ('Referer', 'https://www.idcourts.us/repository/start.do'), 
    ] 
for st in stylesheets: 
    # da trick 
    opener.open(st+';jsessionid='+sessid) 
search = opener.open('https://www.idcourts.us/repository/partySearch.do') 
print cj 
# perhaps need to keep updating the referer... 
+0

Esto parece que ya no funciona. De hecho, es raro ... – albertov

+0

Está funcionando ahora :) Dejé el 'opener.addheaders' colgando en mi sesión de ipython. Ese código debería funcionar como está (funciona para mí en python 2.6 en un Mac al menos) – albertov

+0

El código que publiqué no es robusto. Algunas veces la sesión se mantendrá, otras veces no. Supongo que hay algo implementado en el lado del servidor para desalentar el acceso no humano (es decir, políticas de invalidación de sesiones bastante estrictas) – albertov

0

Creo, que es un problema con el servidor que está fijando una nueva cookie para cada solicitud.

+1

Es no lo hace cuando navega desde un navegador real, aunque ... eso es lo raro. – Adrian

7

No es una respuesta real (pero demasiado tiempo para un comentario); posiblemente sea útil para cualquier otra persona que intente responder esto.

A pesar de mis mejores intentos, no puedo resolver esto.

Al buscar en Firebug, la cookie parece seguir siendo la misma (funciona correctamente) para Firefox.

Agregué urllib2.HTTPSHandler(debuglevel=1) para depurar qué encabezados está enviando Python, y parece que reenvía la cookie.

También he añadido todas las cabeceras de petición de Firefox para ver si eso ayuda (no lo hizo):

opener.addheaders = [ 
    ('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'), 
    .. 
] 

Mi código de prueba:

import cookielib, urllib2 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), urllib2.HTTPSHandler(debuglevel=1)) 
opener.addheaders = [ 
    ('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'), 
    ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), 
    ('Accept-Language', 'en-gb,en;q=0.5'), 
    ('Accept-Encoding', 'gzip,deflate'), 
    ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'), 
    ('Keep-Alive', '115'), 
    ('Connection', 'keep-alive'), 
    ('Cache-Control', 'max-age=0'), 
    ('Referer', 'https://www.idcourts.us/repository/partySearch.do'), 
] 

home = opener.open('https://www.idcourts.us/repository/start.do') 
print cj 

search = opener.open('https://www.idcourts.us/repository/partySearch.do') 
print cj 

siento que me falta algo obvio

+1

podría haber algún desagradable javascript en la página. – jfs

Cuestiones relacionadas