2017-03-20 3 views
0

Versuchen, auf einer CMS-Mitgliedschaftsseite mit Code von scrapy document und Kollegen posts einzuloggen, aber ich komme immer wieder kurz. Meine Fehlermeldungen:Verwenden von Scrapy Shell mit FormRequest

2017-03-20 18:18:07 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://members.com/robots.txt> (referer: None) 
2017-03-20 18:18:07 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://members.com/wp-login.php> (referer: None) 
2017-03-20 18:18:07 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <POST http://members.com/login.php> from <POST http://members.com/login.ph 
p?wpe-login=membersipa> 

Ich habe versucht, User-Agent zu ändern:

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0' 

Aber meine Fehler waren:

2017-03-20 17:47:20 [scrapy.core.engine] DEBUG: Crawled (200) <GET  http://members.com/robots.txt> (referer: None) 
2017-03-20 17:47:22 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://members.com/wp-login.php> (referer: None) 
2017-03-20 17:47:23 [scrapy.core.engine] DEBUG: Crawled (403) <POST http://members.com/wp-login.php?wpe-login=membersipa> (referer: http://members.com/wp-login.php) 
2017-03-20 17:47:23 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <403 http://members.com/wp-login.php?wpe-login=membersipa>: HTTP status code is not handled or not 
allowed 

Dies ist der Code, der die Fehler erzeugt:

import scrapy 

class LoginSpider(scrapy.Spider): 
    name = 'freddy' 
    start_urls = ['http://members.com/wlogin.php'] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(
      response, 
      formdata={'log': 'name', 'pwd': 'password'}, 
      callback=self.after_login 
     ) 

    def after_login(self, response): 
     # check login succeed before going on 
     if "authentication failed" in response.body: 
      self.logger.error("Login failed") 
      return 
    else: 
      return Request(url="http://members.com", 
       callback=self.parse_ipro) 

    def parse_ipro(self, response): 
     title = response.xpath('/html/body/div[2]/div/div[1]/div/div/div[2]/div/div/main/article/header/h1').extract_first() 
     with open(filename, 'wb') as f: 
      f.write(response.body) 
     self.log('Saved file %s' % filename) 

Letztendlich würde ich gerne verwenden Scrapy Shell Selektoren zu testen und versucht Scrapy Verwendung

mit Scrapy Shell versucht, aber auch geklopft am hintern:

import scrapy 

class LoginSpider(scrapy.Spider): 
    name = 'freddy' 
    start_urls = ['http://members.com/wlogin.php'] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(
      response, 
      formdata={'log': 'name', 'pwd': 'password'}, 
      callback=self.after_login 
     ) 

    def after_login(self, response): 
     # check login succeed before going on 
     if "authentication failed" in response.body: 
      self.logger.error("Login failed") 
      return 

und getestet, diese in der Schale:

response.xpath('//title/text()').extract_first() 

erhielt aber 301 und 302 Umleitungen

nach Zugabe:

def parse(self, response): 
    return scrapy.FormRequest.from_response(
     response, 
     headers={'Content-Type': 'text/html; charset=UTF-8', 'User-Agent': 
       'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}, 
     formdata={'log': 'Name', 'pwd': 'Password', }, 
     callback=self.after_login 
    ) 

die Nachricht geändert:

2017-03-22 03:46:07 [scrapy.core.engine] INFO: Spider opened 
2017-03-22 03:46:07 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2017-03-22 03:46:07 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 
2017-03-22 03:46:08 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://members.com/login.php> (referer: None) 
2017-03-22 03:46:08 [scrapy.core.scraper] ERROR: Spider error processing <GET http://members.com/login.php> (referer: None) 
Traceback (most recent call last): 

Hilfe

Antwort

0

geschätzt wird Sie höchstwahrscheinlich einige Header in Ihrer FormRequest fehlt.

Öffnen Sie die Netzwerk-Registerkarte in Ihren Browser-Tools, finden Sie die gesuchten Anfragen und schauen Sie unter "Anfrage-Header" Teil (siehe bezogenen Problem Can scrapy be used to scrape dynamic content from websites that are using AJAX?). Einige der Header sind nicht notwendig und einige sind bereits von FormRequest enthalten, einige sind jedoch nicht so müssen Sie diese replizieren.

Normalerweise ist es Content-Type Header, der repliziert werden muss.

headers = { 
    'Content-Type': 'json/...', 
} 
req = FormRequest(url, formdata=form, headers=headers) 
+0

Vielen Dank für Ihre Hilfe @granitosaurus. Ich habe Inhalte für Schritte hinzugefügt, die auf Ihren Vorschlägen basieren. Auch der Header in Posts (mit Firebug) ist wie folgt: log: \t name pwd: \t kennwort redirect_to: http://members.com/admin/ testcookie: 1 wp-submit: Anmelden – iabraham