2012-06-26 11 views
7

Jestem nowy w złomowaniu i postanowiłem wypróbować go z powodu dobrych recenzji online. Próbuję zalogować się do witryny za pomocą scrapy. Udało mi się zalogować z kombinacją selenu i zmechanizować, zbierając potrzebne ciasteczka z selenem i dodając je do zmechanizowania. Teraz próbuję zrobić coś podobnego za pomocą scrapy i selenu, ale nie mogę sprawić, żeby cokolwiek działało. Nie mogę nawet powiedzieć, czy coś działa, czy nie. Czy ktoś może mi pomóc. Poniżej jest to, od czego zacząłem. Może nawet nie muszę przenosić plików cookie ze złomem, ale nie mogę powiedzieć, czy coś rzeczywiście się loguje, czy nie. DziękiLogowanie do autoryzacji scrapy za pomocą plików cookie

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() 

Odpowiedz

10

Twoje pytanie jest bardziej wystawienia debugowania, więc moja odpowiedź będzie miał tylko kilka notatek na swoje pytanie, a nie dokładną odpowiedź.

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 - tutaj przypisujesz funkcję, a nie wynik, który zwraca. Myślę, że nie musisz w ogóle przekazywać żadnej funkcji jako parametru. Powinno być:

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

cookies argument za Request powinny być DICT - proszę sprawdzić to rzeczywiście dict.

Nie mogę nawet powiedzieć, czy coś działa, czy nie.

Umieść odbitki w wywołaniach zwrotnych, aby śledzić wykonanie.

+1

Po naprawieniu problemów, które zauważyłeś, udało mi się zalogować! Uwaga: pliki cookie, które zwróciło selen, to lista słowników, które musiały zostać zmienione na pojedynczy słownik. Wielkie dzięki za pomoc. – JonDog

+0

Przepraszam, jestem nowy w stackoverflow. Zmęczyłem głosowanie, ale muszę przyznać, że potrzebuję 15 reputacji, zanim będę mógł głosować. Nie widzę żadnego innego sposobu oznaczenia jako odpowiedzi albo UPDATE - Ok, kliknąłem znacznik wyboru. Myślę, że to jest to. – JonDog

+0

@ JohnDog..można napisać o tym, jak obsługiwałeś konwersję plików cookie z jednego formularza do drugiego – Amistad