2016-07-01 11 views
1

こんにちは私はいくつかのランダムなWebサイトにログインするためにscrapyを使っています。私は治療についてのチュートリアルに従いましたが、それは機能していないようです。私が試してみると、私は "isAuthenticated"に気付きます:False。そして、私が返すhtmlボディには、実際のウェブサイトが持つすべてが含まれているわけではありません。私は問題が何であるか分かりません。私はそれがCSRFtokenだと思っていましたが、研究の結果、私は治療がそれを処理すべきだと分かりました。以下にコードを示します。助言がありますか?迷惑メールのログイン認証が機能しない

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

として、それらを投稿するには、私はこの問題を解決しようとする試みでform_idものを追加しましたが、すでに特別な認証トークンへのアクセス権を持っているウェブサイトにアクセスしたする必要があるので、何も –

答えて

0

ウェブサイトにログインするには、あなたがFormRequestを使用する必要があるが、いくつかのウェブサイトのためになる、すなわちビットバケットあなたの例では、

彼らは事前に定義されたフォームがCSRFtoken、セッション情報のような属性を使用し、前のページからしか使用できない他のトークンユーザが訪問した

このような場合、FormRequest.from_responseの治療方法を使用して、あらかじめ定義されたすべてのパラメータを収集することができます応答とFORMDATA

# 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

ああしませんでした。したがって、スパイダーが開始URLでリクエストを呼び出した後にparseが呼び出されるので、レスポンスから特別な認証トークンにアクセスすることができます。この時点では、フォームデータを上書きしないだけで、すでにそこに存在します。私はこの権利を持っていますか?私はちょうど私の頭の中でこれを理解することを確認したい。 –

+0

これを試してみると、通常のログインではなく、「Googleでログインする」オプションが表示されるようです。助言がありますか? –

+0

データを見た後。私は、clickdtaが設定されていないので、デフォルトでgoogleのログインボタンである最初のクリック可能なボタンになっていると仮定します。ありがとう! –

関連する問題