2017-03-20 7 views
0

scrapy documentのコードでCMSメンバーシップサイトにログインしようとしていますが、postsというコードが付いています。私のエラーメッセージ:FormRequestでのSchellシェルの使用

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> 

私はユーザーエージェントを変更してみました:

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

しかし、私のエラーがあった。

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 

これは、エラーを生成するコードです:

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) 

最終的に、私はしたいと思いますセレクタをテストするためにscrapyシェルを使用してscrapyシェルと試みたが、またバットをノックscrapy

を使用してみました:

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 

とシェルでこれをテストした:

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

が、301と302リダイレクトを受け

追加後:

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 
    ) 

メッセージに変更:

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): 

ヘルプは、あなたが最も可能性の高いあなたのFormRequestにいくつかのヘッダーが不足している

答えて

0

を高く評価しています。

ブラウザツールの[ネットワークを開く]タブで、探しているリクエストを見つけて[リクエストヘッダー]の部分を表示します(関連する問題Can scrapy be used to scrape dynamic content from websites that are using AJAX?を参照)。ヘッダーの一部は不要で、一部はすでにFormRequestに含まれていますが、一部のヘッダーは複製する必要はありません。

通常、複製する必要があるのはContent-Typeヘッダーです。

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

ご協力ありがとうございます@granitosaurus。あなたの提案に基づいて行われた手順のコンテンツを追加しました。また、投稿のヘッダー(firebugを使用)は次のとおりです。ログ:\t名前 pwd:\tパスワードredirect_to:http://members.com/admin/ testcookie:1 wp-submit:ログイン – iabraham

関連する問題