2016-05-23 20 views
2

Ich habe gerade angefangen mit Scrapy zu spielen. Ich versuche eine Website zu crawlen, die eine Anmeldung erfordert. Ich habe es gut für Github funktioniert. Ich fand die Formular-ID, fügte die erforderlichen Felder hinzu und alles lief wie geplant ab.Scrapy Login Authentifizierung funktioniert nicht

Wenn ich jedoch dasselbe auf der Investopedia-Website versucht habe, bin ich in Schwierigkeiten geraten. Ich füge den Code an.

class Investo_spider(InitSpider): 
    name = 'investo_spider' 
    allowed_domains = ['investopedia.com'] 
    login_page = 'http://www.investopedia.com/accounts/login.aspx' 
    start_urls = ['http://www.investopedia.com'] 

    def init_request(self): 
     return Request(url=self.login_page, callback=self.login) 

    def login(self, response): 
      return FormRequest.from_response(response, 
           formdata={'email': 'mymail','password': 'mypass'}, 
           callback=self.check_login_response) 

    def check_login_response(self, response): 
     if "myname" in response.body: 
      self.log("Successfully logged in. Let's start crawling!") 
      self.initialized() 
     else: 
      self.log("Login was unsuccessful") 


    def parse_item(self, response): 
     print 'I got in here, finally!!!!' 
     pass 

habe ich versucht, die Zugabe von formnumber = 0, clickdata = { 'NR': 0} und das Ändern der Methode (POST oder GET), obwohl die Standardwerte bereits die richtige Form und der Auswahl wurden anklickbare.

Überraschenderweise habe ich es auf einem mechanisierten Browser arbeiten, mit den gleichen Parametern. Ich kann den HTML-Code in ein HtmlResponse-Objekt konvertieren, das scrapy verarbeiten kann.

br = mechanize.Browser() 
br.open("http://www.investopedia.com/accounts/login.aspx") 
br.select_form(nr=0) 
br.form["email"] = 'mymail' 
br.form["password"] = 'mypass' 
br.submit() 
br.open('http://www.investopedia.com') 
response = HtmlResponse(url="some_url"),body=br.response().read()) 

Dies würde jedoch bedeuten, ich muss den mechanize Browser herumtragen würde, was ich davon ausgehen, ist nicht die beste aller Lösungen. Ich denke, ich könnte etwas verpassen. Ich würde mich sehr über Ihren Beitrag zu diesem Thema freuen. Vielen Dank!

+0

Scrapy behandelt nicht sehr gut aspx Formen, ich habe in diesem zuvor, ich endete gerade mit Selen, um die Anmeldung zu tun und speichern Sie die Cookies und scrapy verwenden sie. Versuchen Sie, eine Anfrage zu "liefern", anstatt in 'init_request' zurückzukehren. –

+0

Versuchen Sie auch,' {'remember': '1'} ' – kev

+0

@RafaelAlmeida einzureichen. Haben Sie einen Beispielcode für Selen? @kev Das '{'remember': '1'}' zusätzliche Senden hatte keine Wirkung. Ich denke über die Mechanisierung nach, obwohl es nicht sehr elegant ist. – user3225486

Antwort

0

Sie müssten Umleitung behandeln. Das wird für dich funktionieren.

class Investo_spider(scrapy.Spider): 
name = 'investo_spider' 
allowed_domains = ['investopedia.com'] 
login_page = 'http://www.investopedia.com/accounts/login.aspx' 
start_urls = ['http://www.investopedia.com'] 

def init_request(self): 
    return scrapy.Request(url=self.login_page, callback=self.login) 

def parse(self, response): 
    return scrapy.FormRequest('http://www.investopedia.com/accounts/login.aspx', 
            formdata={'email': 'you_email', 'password': 'your_password', 
               'form_build_id': 'form - v14V92zFkSSVFSerfvWyH1WEUoxrV2khjfhAETJZydk', 
               'form_id': 'account_api_form', 
               'op': 'Sign in' 
               }, 
            meta = {'dont_redirect': True, 'handle_httpstatus_list':[302]}, 
            callback=self.check_login_response) 

def check_login_response(self, response): 
    return scrapy.Request('http://www.investopedia.com/accounts/manageprofile.aspx', self.validate_login) 

def validate_login(self, response): 
    if "myname" in response.body: 
     self.log("Successfully logged in. Let's start crawling!") 
     self.initialized() 
    else: 
     self.log("Login was unsuccessful") 

def parse_item(self, response): 
    print 'I got in here, finally!!!!' 
    pass 
+0

Danke für die Vorschläge @Usman, aber das scheint nicht das Problem zu sein. Die Anmeldung ist immer noch nicht erfolgreich. – user3225486

+0

Dieser Code läuft für mich gut. Ich habe einen Demo-Benutzer gemacht und login mit scrapy durchführen. es funktioniert gut. –