2012-06-26 20 views
7

soy nuevo en scrapy y decidí probarlo debido a buenas críticas en línea. Estoy intentando iniciar sesión en un sitio web con scrapy. He iniciado sesión exitosamente con una combinación de selenio y mecanizado al recopilar las cookies necesarias con selenio y agregarlas al mecanizado. Ahora estoy tratando de hacer algo similar con scrapy y selenio, pero no puedo hacer nada para que funcione. Realmente no puedo decir si algo funciona o no. Alguien puede ayudarme por favor. Debajo está lo que comencé. Puede que ni siquiera necesite transferir las cookies con scrapy, pero no puedo decir si la cosa realmente inicia sesión o no. Gracias autenticación scrapy inicio de sesión con cookies

from scrapy.spider import BaseSpider 
from scrapy.http import Response,FormRequest,Request 
from scrapy.selector import HtmlXPathSelector 
from selenium import webdriver 

class MySpider(BaseSpider): 
    name = 'MySpider' 
    start_urls = ['http://my_domain.com/'] 

    def get_cookies(self): 
     driver = webdriver.Firefox() 
     driver.implicitly_wait(30) 
     base_url = "http://www.my_domain.com/" 
     driver.get(base_url) 
     driver.find_element_by_name("USER").clear() 
     driver.find_element_by_name("USER").send_keys("my_username") 
     driver.find_element_by_name("PASSWORD").clear() 
     driver.find_element_by_name("PASSWORD").send_keys("my_password") 
     driver.find_element_by_name("submit").click() 
     cookies = driver.get_cookies() 
     driver.close() 
     return cookies 

    def parse(self, response,my_cookies=get_cookies): 
     return Request(url="http://my_domain.com/", 
      cookies=my_cookies, 
      callback=self.login) 

    def login(self,response): 
     return [FormRequest.from_response(response, 
      formname='login_form', 
      formdata={'USER': 'my_username', 'PASSWORD': 'my_password'}, 
      callback=self.after_login)] 

    def after_login(self, response): 
     hxs = HtmlXPathSelector(response) 
     print hxs.select('/html/head/title').extract() 

Respuesta

10

Su pregunta es más bien cuestión de depuración, así que mi respuesta va a tener sólo algunas notas sobre su pregunta, no la respuesta exacta.

def parse(self, response,my_cookies=get_cookies): 
    return Request(url="http://my_domain.com/", 
     cookies=my_cookies, 
     callback=self.login) 

my_cookies=get_cookies - va a asignar una función aquí, no el resultado que devuelve. Creo que no necesita pasar ninguna función aquí como parámetro en absoluto. Debería ser:

def parse(self, response): 
    return Request(url="http://my_domain.com/", 
     cookies=self.get_cookies(), 
     callback=self.login) 

cookies argumento para Request debe ser un diccionario - por favor, compruebe que es de hecho un dict.

No puedo decir realmente si algo funciona o no.

Ponga algunas impresiones en las devoluciones de llamada para seguir la ejecución.

+1

Después de solucionar los problemas que anotó, ¡pude iniciar sesión correctamente! Nota: las cookies que devolvió el selenio fueron una lista de diccionarios que tuvieron que cambiarse a un solo diccionario. Muchas gracias por la ayuda. – JonDog

+0

lo siento, soy nuevo en stackoverflow. Me cansé de votar pero dice que necesito 15 reputación antes de poder votar. No veo otra forma de marcar como respondida tampoco .. ACTUALIZACIÓN - Bien, hice clic en la marca de verificación. Creo que es eso. – JonDog

+0

@ JohnDog ... podría publicar cómo se manejó la conversión de cookies de una forma a la otra – Amistad

Cuestiones relacionadas