存储形式:
- 存储在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