2012-01-03 11 views
17

Estoy intentando acceder a la cookie de sesión dentro de una araña. La primera vez que conecto a una red social utilizando en una araña:Cookie de sesión de acceso en scrap spiders

def parse(self, response): 

     return [FormRequest.from_response(response, 
       formname='login_form', 
       formdata={'email': '...', 'pass':'...'}, 
       callback=self.after_login)] 

En after_login, me gustaría tener acceso a las cookies de sesión, con el fin de pasarlos a otro módulo (selenio aquí) para procesar aún más la página con una sesión autenticada

me gustaría algo así:

 def after_login(self, response): 

     # process response 
     ..... 

     # access the cookies of that session to access another URL in the 
     # same domain with the autehnticated session. 
     # Something like: 
     session_cookies = XXX.get_session_cookies() 
     data = another_function(url,cookies) 

Desafortunadamente, response.cookies no devuelve las cookies de sesión.

¿Cómo puedo obtener las cookies de sesión? Estaba mirando el middleware de cookies: scrapy.contrib.downloadermiddleware.cookies y scrapy.http.cookies pero no parece haber ninguna forma directa de acceder a las cookies de sesión.

Algunos más detalles aquí acerca de mi pregunta original:

Por desgracia, he usado su idea pero DIND'T ver las cookies, aunque sé con seguridad que existe desde el scrapy.contrib.downloadermiddleware .cookies ¡middleware imprime las cookies! Estas son exactamente las cookies que quiero capturar.

Así que aquí es lo que estoy haciendo:

El after_login (sí, la respuesta) método recibe la variable de respuesta después de la autenticación correcta, y luego acceder a una dirección URL con los datos de sesión:

def after_login(self, response): 

     # testing to see if I can get the session cookies 
     cookieJar = response.meta.setdefault('cookie_jar', CookieJar()) 
     cookieJar.extract_cookies(response, response.request) 
     cookies_test = cookieJar._cookies 
     print "cookies - test:",cookies_test 

     # URL access with authenticated session 
     url = "http://site.org/?id=XXXX"  
     request = Request(url=url,callback=self.get_pict) 
     return [request] 

Como la salida siguiente muestra, de hecho hay galletas, pero no logran captar con CookieJar:

cookies - test: {} 
2012-01-02 22:44:39-0800 [myspider] DEBUG: Sending cookies to: <GET http://www.facebook.com/profile.php?id=529907453> 
    Cookie: xxx=3..........; yyy=34.............; zzz=.................; uuu=44.......... 

así que me gustaría conseguir un diccionario que contiene las claves xxx, yy y etc. con los valores correspondientes.

Gracias :)

+0

¿Entiendo correctamente que desea autenticar en facebook, pero raspar los datos de un dominio diferente ser autenticado en Facebook? – warvariuc

Respuesta

6

Tal vez esto es una exageración, pero no saben cómo se va a utilizar esas galletas, por lo que podrían ser útiles (un fragmento de código real - lo adaptan a su caso) :

from scrapy.http.cookies import CookieJar 

class MySpider(BaseSpider): 

    def parse(self, response): 

     cookieJar = response.meta.setdefault('cookie_jar', CookieJar()) 
     cookieJar.extract_cookies(response, response.request) 
     request = Request(nextPageLink, callback = self.parse2, 
         meta = {'dont_merge_cookies': True, 'cookie_jar': cookieJar}) 
     cookieJar.add_cookie_header(request) # apply Set-Cookie ourselves 

CookieJar tiene algunos métodos útiles.

Si aún no ve las cookies, ¿quizás no estén allí?


ACTUALIZACIÓN:

En cuanto a CookiesMiddleware código:

class CookiesMiddleware(object): 
    def _debug_cookie(self, request, spider): 
     if self.debug: 
      cl = request.headers.getlist('Cookie') 
      if cl: 
       msg = "Sending cookies to: %s" % request + os.linesep 
       msg += os.linesep.join("Cookie: %s" % c for c in cl) 
       log.msg(msg, spider=spider, level=log.DEBUG) 

lo tanto, tratar request.headers.getlist('Cookie')

+1

¡Muchas gracias por su respuesta! Desafortunadamente, todavía no funcionó. Sin embargo, sé con certeza que hay cookies. Ver la publicación a continuación por lo que hice. – mikolune

+0

¡Por favor, mira mi edición en la publicación original para ver mi respuesta! Muchas gracias :) – mikolune

+0

@mikolune, mira la actualización. Además, aprenda a buscar en el código fuente, es por eso que Python es bueno, puede buscar en el código fuente, que a veces es la mejor documentación. – warvariuc

12

Un ejemplo clásico es tener un servidor de inicio de sesión, lo que proporciona un nuevo identificador de sesión después de un inicio de sesión exitoso. Esta nueva identificación de sesión se debe usar con otra solicitud.

Aquí está el código recogido de la fuente que parece funcionar para mí.

print 'cookie from login', response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 

Código:

def check_logged(self, response): 
tmpCookie = response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 
print 'cookie from login', response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 
cookieHolder=dict(SESSION_ID=tmpCookie) 

#print response.body 
if "my name" in response.body: 
    yield Request(url="<<new url for another server>>", 
     cookies=cookieHolder, 
     callback=self."<<another function here>>") 
else: 
    print "login failed" 
     return 
Cuestiones relacionadas