2017-05-11 6 views
1

Ich habe ein Skript meine akzeptierte Lösungen zu schreiben versucht, auf SPOJ See moreAnmeldung Automatisierung und kriechenden mit Scrapy Python

ich bei der Automatisierung der Login-Prozess stecken geblieben abzurufen. Ich fand Scrapy schwer zu verstehen. Nachdem man durch die Dokumentation und den Codebeispielen viele Male habe ich eine vage Vorstellung von dem, was hinter den Kulissen passiert, und das ist, wo ich jetzt stehen:

(ich habe den Code an erforderlichen Stellen kommentiert)

import os 
import os.path 
import scrapy 
import urllib.request 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import Request 
from bs4 import BeautifulSoup 

class LoginSpider(scrapy.Spider): 
    name = 'spoj' 
    start_urls = ['http://www.spoj.com/login'] 
    outputFile = open('output.txt' , 'w') 

    def parse(self, response): 
     username = input('Enter username\n') 
     password = input('Enter password\n') 
     return scrapy.FormRequest.from_response(
      response, 
      formdata={'username': username, 'password': password}, 
      callback=self.after_login 
     ) 

    def after_login(self, response): 

     # Even if I type in correct username and password it always leads to 
     # authentication faliure and the following if statement evaluates to true. 

     if str.encode('Authentication failed!') in response.body: 
      self.logger.error("Login failed") 
      print ('Incorrect credentials') 
      return  

     print('lol') # ofcourse this isn't printed 
     return scrapy.Request(url = "http://www.spoj.com/myaccount/" , callback = self.retrieve_codes) 

    # needless to say, the following function is never called 
    def retrieve_codes(self, response): 

     print('Hello testing!') 
     url = 'http://www.spoj.com/files/src/16731976/' 
     html = urllib.request.urlopen(url).read() 
     soup = BeautifulSoup(html , 'html.parser') 
     self.outputFile.write(str(soup.prettify())) 

In der Dokumentation war es if "authentication failed" in response.body:, die ich

  • ich war immer diesen Fehler ist

    if str.encode('Authentication failed!') in response.body: Gründe

    geändert a byte like object is required not 'str'
  • Bei Eingabe falscher Zugangsdaten wird Authentication failed! angezeigt und nicht authentication failed. Wir müssen hier genau sein.

Bitte sagen Sie mir, wo ich falsch mache. Ich habe keine guten Ressourcen im Netz gefunden, die die Formvalidierung im Detail diskutieren. Nach dem Sehen this code from docs meine ersten Fragen waren,

  • Ist dies der einzige Weg, es zu tun?
  • Funktioniert diese Methode für jede Website? Weil ich gelernt habe, dass die Komplexität dieses Prozesses von Ort zu Ort variiert.
  • Kann ich eine noch anschaulichere Erklärung dafür finden, was dahinter passiert?

Ich habe auch versucht, Robobrowser, aber vergeblich. Ich erwartete eine gute Dokumentation wie die einer schönen Suppe.

Danke!

Antwort

2

Sie verwenden die falschen Feldnamen formdata. Sie müssen den Beispielcode von den Scrapy-Dokumenten auf die spezifische Website anpassen. Derzeit verwenden Sie username und password als Felder.

Wenn Sie bei der Anmeldung die Entwicklertools Ihres Browsers verwenden, sehen Sie, dass die Felder, die von POST gesendet werden, mit login_user und password gekennzeichnet sind.

Das sollte also einfach zu beheben sein :-)

+0

danke! :) Ich wusste nicht, dass der Wert des Attributs 'name' in Formulardaten verwendet wird. Meine beschämende Ignoranz –