session - manager - google conversion linker
Accede a la cookie de sesión en arañas desechadas. (2)
Tal vez esto sea una exageración, pero no sé cómo va a utilizar esas cookies, por lo que podría ser útil (un extracto de código real: adáptelo 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 todavía no ves las cookies, tal vez no estén allí.
ACTUALIZACIÓN :
Mirando el código de CookiesMiddleware
:
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)
Por lo tanto, intente request.headers.getlist(''Cookie'')
Estoy tratando de acceder a la cookie de sesión dentro de una araña. Primero me conecto a una red social usando una araña:
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 acceder a las cookies de sesión, para pasarlas a otro módulo (selenio aquí) para procesar 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 buscando en el middleware de las cookies: scrapy.contrib.downloadermiddleware.cookies y scrapy.http.cookies, pero no parece haber ninguna forma directa de acceder a las cookies de la sesión.
Algunos detalles más aquí sobre mi pregunta original:
Desafortunadamente, utilicé su idea pero no vi las cookies, aunque estoy seguro de que existen desde que el middleware scrapy.contrib.downloadermiddleware.cookies imprime las cookies. Estas son exactamente las cookies que quiero tomar.
Así que aquí está lo que estoy haciendo:
El método after_login (auto, respuesta) recibe la variable de respuesta después de la autenticación adecuada, y luego accedo a una URL con los datos de la 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 se muestra en la salida a continuación, existen cookies, pero no las capturo 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 obtener un diccionario que contenga las claves xxx, yyy, etc. con los valores correspondientes.
Gracias :)
Un ejemplo clásico es tener un servidor de inicio de sesión, que proporciona una nueva identificación de sesión después de un inicio de sesión exitoso. Este nuevo identificador de sesión debe usarse 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