2017-08-22 166 views
0

我正在嘗試登錄,但它甚至沒有輸入表單數據。 這是我的代碼登錄部分:scrapy登錄不起作用

start_urls = ['https://stmforum.com/amember/login.php'] 

def parse(self, response): 
     return FormRequest(url="https://stmforum.com/amember/protect/new-rewrite?f=2&url=/forum/forum.php&host=stmforum.com&ssl=on", 
           formdata={'amember_login': 'username','amember_pass':'password'}, 
           callback=self.after_login) 

    def after_login(self,response): 
     if "incorrect" in response.body: 
       self.logger.error("Login failed") 
       return 

     elif "Login to your Account" in response.body: 
       self.logger.error("Try again") 
       return 
     else: 
       pass 

這是網站的HTML代碼的一部分:

<form name="login" method="post" action="/amember/login"> 
<fieldset> 
<legend>Login to your Account</legend> 
<div id="recaptcha-row" class="row" style="display: none;" data-recaptcha-theme="light" data-recaptcha-size="normal"> 
<div class="row"> 
<div class="element-title"> 
<div class="element"> 
<input id="amember-login" name="amember_login" size="15" value="" autofocus="autofocus" placeholder="Username/Email" type="text"/> 
</div> 
</div> 
<div class="row"> 
<div class="element-title"> 
<div class="element"> 
<input id="amember-pass" class="am-pass-reveal" name="amember_pass" size="15" placeholder="Password" type="password"/> 
<span class="am-switch-reveal am-switch-reveal-off" title="Toggle Password Visibility"/> 
<label id="am-form-login-remember" class="element-title" for="remember_login"> 
</div> 
</div> 
<div class="row"> 
</fieldset> 
<input name="login_attempt_id" value="1503392293" type="hidden"/> 
<input name="amember_redirect_url" value="https://stmforum.com/forum/forum.php" type="hidden"/> 

而履帶式的結果:

[seeker] ERROR: Try again 
[scrapy.core.engine] INFO: Closing spider (finished) 

它去到after_login elif語句,這意味着它沒有改變頁面。基本上說,它甚至不輸入表單中的數據,也不會單擊登錄。 我試圖把形式數據「用戶名」和「密碼」我也試圖把id「amember-login」和「amember-pass」。 也試圖把clickdata = {'submit':'commit') 也試過FormRequest.from_response

與硒和它工作得很好。 我想用scrapy實現selenium,但它在服務器上不起作用。

有人可以幫助我嗎?

UPDATE:

start_urls = ['https://stmforum.com/amember/login.php'] 

    def parse(self, response): 
     return FormRequest.from_response(response, 
           formdata={'amember_login':'user','amember_pass':'pass'}, 
           callback=self.after_login) 

    def after_login(self,response): 
     if "incorrect" in response.body: 
       self.logger.error("Login failed") 
       return 

     elif "Login to your Account" in response.body: 
       self.logger.error("Try again") 
       return 
     else: 
       return FormRequest(url="https://stmforum.com/forum/", 
             formdata={'query': 'AdCombo'}, 
             callback=self.parse_page) 

和響應我得到:

[scrapy.core.engine] DEBUG: Crawled (200) <GET https://stmforum.com/amember/login.php> (referer: None) 
[scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://stmforum.com/amember/member> from <POST https://stmforum.com/amember/login> 
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://stmforum.com/amember/member> (referer: https://stmforum.com/amember/login.php) 
[seeker] ERROR: Try again 
[scrapy.core.engine] INFO: Closing spider (finished) 

的 'login_attempt_id' 對的每個請求的改變......我如何實現隱藏的價值形式數據。或者我還能做什麼?

+0

你用['FormRequest.from_response()'](https://docs.scrapy.org/en/latest/topics/request-response.html#using-formrequest-from-響應到模擬 - 一個用戶登錄)? –

+0

好的,你做到了。你是如何使用它的?有一些隱藏的字段,所以你需要通過它們似乎(例如'login_attempt_id')。您可以比較瀏覽器發送的內容(使用瀏覽器的Dev Tools網絡面板)和Scrapy發送的內容(例如,使用「scrapy shell https:// stmforum.com/amember/login.php」),然後檢查「FormRequest」的結果。 from_response()' –

+0

我已經試過from_response之前,我再次嘗試它。我注意到login_attempt_id,但它會改變每個請求....我正在尋找一個令牌,我發現該ID代替。 – Omega

回答

0

我檢查網站,您的文章是錯誤的URL

def parse(self, response): 
     return FormRequest.from_response(response, 
           formdata={'amember_login': 'username','amember_pass':'password'}, 
           callback=self.after_login) 

的原因是,有需要發送額外的隱藏變量。這就是爲什麼你需要使用from_response

Login hidden variables

+0

你需要將響應傳遞給'from_response()'(並且url參數是不必要的) –

+0

@paultrmbrth,感謝您注意到這一點。沒有意識到不會刪除它。更新了答案。 –

+0

仍然缺少作爲第一個參數的「響應」 –

1

我發現,我留在scrapy設置中禁用的cookie。現在它工作正常。 非常感謝你