2017-03-28 3 views
2

Ich verwende die folgende Spinne zum Crawlen der tinyz.us Website, die eine Authentifizierung erfordert.Scrapy, Login mit Captcha fehlgeschlagen

from scrapy.spiders import BaseSpider 
from scrapy.http import FormRequest 
import urllib2 


class Start(BaseSpider): 
    name = 'test' 
    start_urls = ["http://tinyz.us"] 

    def parse(self, response): 

     user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
     headers = {'User-Agent': user_agent} 
     imgRequest = urllib2.Request("http://tinyz.us/securimage/securimage_show.php", headers=headers) 
     imgData = urllib2.urlopen(imgRequest).read() 

     with open('captcha.png', 'wb') as f: 
      f.write(imgData) 

     captcha = raw_input("-----> Enter the captcha in manually :") 

     return FormRequest.from_response(
      response=response, 
      formdata={"login_user": "myusername", 
         "login_password": "mypass", 
         "captcha_code": captcha}, 
      formxpath="//*[@id='login-form']", 
      callback=self.after_login, 
      headers=headers) 

    def after_login(self, response): 
     print("AFTER LOGIN") 
     with open('response.html', 'w') as f: 
      f.write(response.body) 

Die Website verwendet eine konstante URL für das Captcha zu erzeugen und es scheint, dass jedes Mal, wenn ein neues erzeugt. Ich bin nicht mit der jeweiligen Technologie vertraut, aber die Art und Weise, wie ich dieses Problem umgehen kann, besteht darin, das Captcha zu speichern und manuell zu übergeben.

Das Problem ist, dass es immer eine fehlgeschlagene Antwort zurückgibt, ich bin mir nicht sicher, ob das Problem wegen der Art und Weise ist, dass Scrapy die Daten an form oder wegen des Captcha übergibt und ich keine Möglichkeit zum Debuggen finden kann die Spinne richtig.

Antwort

1

ok, das Problem hier ist, dass das Captcha-Bild die Cookies von der tatsächlichen Antwort erhalten muss, und Sie verwenden urllib2, um die Captcha-Anfrage zu machen, so dass Scrapy dies standardmäßig nicht behandelt.

eine scrapy Anfrage Verwenden Sie das Captcha, so etwas wie zu überprüfen:

def parse(self, response): 
    yield Request(url="http://tinyz.us/securimage/securimage_show.php", callback=self.parse_captcha, meta={'previous_response': response}) 

def parse_captcha(self, response): 
    with open('captcha.png', 'wb') as f: 
     f.write(response.body) 

    captcha = raw_input("-----> Enter the captcha in manually :") 

    return FormRequest.from_response(
     response=response.meta['previous_response'], 
     formdata={"login_user": "myusername", 
        "login_password": "mypass", 
        "captcha_code": captcha}, 
     formxpath="//*[@id='login-form']", 
     callback=self.after_login) 
+0

Wie soll ich beinhalten die 'captcha' nach der Eingabe von Zeichen manuell. Sie verwenden es nicht in der 'Parse'-Funktion. Also, was ist das Request innerhalb des 'Parse'? – Kasramvd

+0

Entschuldigung, ich habe vergessen, den unnötigen Teil von 'parse' zu ​​entfernen, überprüfen Sie bitte die aktualisierte Antwort – eLRuLL

+0

Es löst' Datei '/usr/lib/python2.7/dist-packages/twisted/internet/defer.py ", Zeile 588, in _runCallbacks current.result = Rückruf (current.result, * args, ** kw) Datei "/usr/local/lib/python2.7/dist-packages/scrapy/spiders/__init__.py", Zeile 76, in parse raise NotImplementedError' – Kasramvd