2016-06-29 56 views
3

我使用Scrapy蜘蛛,在啓動時使用登錄表單進行身份驗證。然後它通過認證會話進行擦除。堅持認證的Scrapy爬蟲之間的會話

在開發過程中,我通常會多次運行蜘蛛來測試它。在每次運行開始時驗證垃圾郵件網站的登錄表單。該網站通常會強制重置密碼作爲迴應,並且如果這種情況持續,我懷疑它會禁止該帳戶。

由於cookies持續數小時,因此沒有充分的理由在開發過程中經常登錄。爲了解決密碼重置問題,在開發過程中重複使用經過身份驗證的會話/ cookie之間的最佳方式是什麼?理想情況下,蜘蛛只會嘗試驗證持續會話是否已過期。

編輯:

我的結構是這樣的:上市

def start_requests(self): 
     yield scrapy.Request(self.base, callback=self.log_in) 

def log_in(self, response): 
     #response.headers includes 'Set-Cookie': 'JSESSIONID=xx'; Path=/cas/; Secure; HttpOnly' 
     yield scrapy.FormRequest.from_response(response, 
             formdata={'username': 'xxx', 
                'password':''}, 
              callback=self.logged_in) 
def logged_in(self, response): 
     #request.headers and subsequent requests all have headers fields 'Cookie': 'JSESSIONID=xxx'; 
     #response.headers has no mention of cookies 
     #request.cookies is empty 

當我運行在Chrome相同的頁面請求時,「曲奇」標籤下還有約20場。

這裏的documentation看起來很薄。我試着根據成功登錄返回的值在所有傳出請求的標題字段上設置字段'Cookie': 'JSESSIONID=xxx',但這會彈回到登錄屏幕

+0

你回答你自己那裏,cookie保存到文件並加載它們回來...你嘗試過什麼? –

+0

@RafaelAlmeida增加了一個編輯,你能澄清我應該保存什麼,我應該在哪裏加載它? – Regan

回答

5

原來,對於特設開發解決方案比我想象的更容易做到。獲取cookie字符串與cookieString = request.headers['Cookie'],保存,然後在後續的傳出請求加載它,做:

request.headers.appendlist('Cookie', cookieString)