存儲形式: 存儲在redis中,“spider_name:username–password":cookie 建立py文件及包含方法: initcookies() 初始化所有賬號的cookies,將所有賬號對用進行登陸獲取cookies並保存在redis中 update_cookie(spider_ ...
存儲形式:
- 存儲在redis中,“spider_name:username–password":cookie
建立py文件及包含方法:
- initcookies() 初始化所有賬號的cookies,將所有賬號對用進行登陸獲取cookies並保存在redis中
- update_cookie(spider_name,username,password) # 重新獲取賬號對應的cookies,並存入redis中
- remove_cookie(spider_name,usrname,password) # 從redis中刪除改賬號對應的cookie
- get_cookie(username,password) # 嘗試登陸該賬號獲取cookies
在scrapy下載器中間件的process_request()隨機從cookie池選擇一個cookie,對request進行設置,併在request的meta中保存cookie對應的賬號
def process_request(self,request,spider): # 獲取redis中所有的鍵(假設redis中只保存了cookies) redisKeys = self.rconn.keys() elem = random.choice(redisKeys) request.cookies = cookie # 在請求中記錄當前cookies對應的賬號和密碼 request.meta["accountText"] = elem.split(":")[-1]
在下載器中間件的process_response()獲取響應,如果響應狀態碼為301、302等,說明頁面重定向,該cookie失效,進行cookie的更新與刪除
def process_response(self,request,response,spider): if response.status in [300, 301, 302, 303]: # 獲取重定向的url redirect_url = response.headers["location"] if url == "login_url":# 如果是登陸頁面,說明當前cookies失效了,需要更新 username,passworod = request.meta['accountText'].split("--") update_cookie(spider_name,username,password) elif url=="驗證頁面":# 說明賬號被封了 username,passworod = request.meta['accountText'].split("--") remove_cookie(spider_name,username,password) request = request.copy() request.dont_filter = True return request