2016-07-01 21 views
1

Hallo Ich arbeite mit Scrapy, um sich in einige zufällige Website einloggen. Ich habe die Tutorials auf scrapy verfolgt und es scheint nicht zu funktionieren. Wenn ich es versuche, bemerke ich, dass "isAuthenticated": False. Und der HTML-Body, den ich zurückgebe, enthält nicht alles, was die eigentliche Website tut. Ich bin mir nicht sicher, was das Problem ist. Ich dachte, es wäre das CSRFtoken, aber nach der Recherche fand ich heraus, dass Scrapy damit umgehen sollte. Hier ist der Code unten. Irgendwelche Vorschläge?Scrapy Login-Authentifizierung funktioniert nicht

import scrapy 
    import sys 
    from scrapy import Spider 
    from scrapy import Request 

    class IvanaSpider(Spider): 
    name = 'ivanaSpider' 

    def start_requests(self): 
     return [scrapy.FormRequest(
       'https://bitbucket.org/account/signin/?next=/', 
       formdata={'username': 'username', 'password': 'password', 
         'form_build_id': 'form - v14V92zFkSSVFSerfvWyH1WEUoxrV2khjfhAETJZydk', 
         'form_id': 'account_api_form', 
         'op': 'Sign in' 
       }, 
       callback=self.after_login)] 

    def after_login(self, response): 
     # check login succeed before going on 
     if "It's recommended that you log in" in response.body: 
      print "------------------------------------------" 
      self.logger.error("Login failed") 
      return 

     # continue scraping with authenticated session... 
     for line in response.xpath('//body').extract(): 
      print line.encode(sys.stdout.encoding, errors='replace') 
+0

ich die form_id Sachen in einem Versuch hinzugefügt, dies zu beheben, aber nichts –

Antwort

0

zur Webseite anzumelden, müssen Sie FormRequest aber für einige Website verwenden, dh bitbucket in Ihrem Beispiel

sie vordefinierte Form Attribute wie CSRFtoken, Session Informationen verwenden und andere Token, die nur von der vorherigen Seite verwendet werden können Benutzer besucht

In solchen Fällen kann man FormRequest.from_response Methode von scrapy verwenden, die alle vordefinierten Parameter abholen die Antwort und poste sie als Formulardaten

# For example 
import scrapy 
import sys 
from scrapy import Spider 
from scrapy import Request 

class IvanaSpider(Spider): 
    name = 'ivanaSpider' 
    start_urls = (
     'https://bitbucket.org/account/signin/?next=/', 
    ) 

    def parse(self, response): 
     yield scrapy.FormRequest.from_response(
      response=response, 
      formdata={"username": "<your username>", 
         "password": "<your password>"}, 
      #formname="login",apparently there are many socal login forms so select one based on xpath (form id) 
      formxpath=".//form[@id='aid-login-form']", 
      callback=self.after_login, 
      dont_click=True, 

     ) 

    def after_login(self, response): 
     # check login succeed before going on 
     if "It's recommended that you log in" in response.body: 
      print "------------------------------------------" 
      self.logger.error("Login failed") 
      return 

     # continue scraping with authenticated session... 
     for line in response.xpath('//body').extract(): 
      print line.encode(sys.stdout.encoding, errors='replace') 
+0

ah, so dass Sie die Website haben, benötigen Zugriff auf bereits Zugriff auf spezielle Authentifizierungs-Token zu haben. Da also parse aufgerufen wird, nachdem die Spider eine Anforderung an die Start-URL aufgerufen hat, hat sie im Wesentlichen Zugriff auf das spezielle Authentifizierungstoken aus der Antwort. An dieser Stelle überschreiben wir einfach nicht die formdata, und es wird schon da sein. Habe ich das richtig? Ich will nur sicherstellen, dass ich das in meinem Kopf verstehe. –

+0

Nachdem ich dies versucht habe, scheint es, dass es mich auf die "Anmeldung mit Google-Option" statt der regulären Anmeldung bringt. Irgendwelche Vorschläge? –

+0

Nach dem Betrachten der Daten. Ich nehme an, dass clickdta nicht gesetzt ist, sondern standardmäßig die erste anklickbare Schaltfläche ist, bei der es sich um die Google-Login-Schaltfläche handelt. Vielen Dank! –