class CookiesGenerator(): def __init__(self, name='jdcookies'): self.name = name self.account_db = RedisClient('jdaccount') self.cookies_db = RedisClient(self.name) def process_cookies(self, cookies): dict = {} # 提取cookies中的name和value组成新字典 for cookie in cookies: dict[cookie['name']] = cookie['value'] return dict def run(self): # 提取redis数据库中的账号,进行对比,看哪个账号换没有获取cookies account_usernames = self.account_db.usernames() cookies_usernames = self.cookies_db.usernames() for username in account_usernames: # 如果账号没有存在与cookies表中说明没有获取cookies if not username in cookies_usernames: password = self.account_db.get(username) print('正在生成账号为%s的cookies' % username) # 这块是我们cookies文件中的返回结果 result = Cookies(username, password).main() time.sleep(10) if result.get('status') == 1: # cookies = self.process_cookies(result.get('content')) cookies = result.get('content') print('成功获取到cookies', cookies) if self.cookies_db.set(username, json.dumps(cookies)): print("成功保存cookies") elif result.get('status') == 2: print(result.get('content')) if self.account_db.delete(username): print('成功删除错误账号') else: print(result.get('content'))
class TestCookies(): def __init__(self): self.account_db = RedisClient('jdaccount') self.cookies_db = RedisClient('jdcookies') self.headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ' } self.testUrl = 'https://www.jd.com/' def test(self, username, cookies): print('开始测试账号为%s的cookies' % username) try: # 测试格式是否为json格式 json.dumps(cookies) except TypeError: print('cookies不合法', username) self.cookies_db.delete(username) print('删除cookies', username) return try: # 加入cookies测试有效性 response = requests.get(self.testUrl, headers=self.headers, cookies=cookies, timeout=5, allow_redirects=False) if response.status_code == 200: print('账号%s的cookies有效' % username) else: print(response.status_code, response.headers) print('账号%s的cookies已失效' % username) self.cookies_db.delete(username) print('删除cookies', username) except ConnectionError as e: print('发生异常', e.args) def process_cookies(self, cookies): dict = {} # 提取cookies中的name和value组成新字典,可供requests调用的cookies for cookie in cookies: dict[cookie['name']] = cookie['value'] return dict def run(self): # 获取cookies表中的所有账号cookies cookies_groups = self.cookies_db.all() for username, cookies in cookies_groups.items(): # 将JSON格式转换为字典 a = json.loads(cookies) # 将selenium生成的cookies转换为requests需要的格式进行测试 b = self.process_cookies(a) self.test(username, b) # a = CookiesGenerator() # a = TestCookies() # a.run()
class CookiesGenerator(object): def __init__(self, website='default'): self.website = website self.cookies_db = RedisClient('cookies', self.website) self.account_db = RedisClient('account', self.website) self.init_browser() # 当不需要实例得时候我们手动销毁,释放内存 def __del__(self): self.close() # 这里对浏览器进行设置, def init_browser(self): # 如果加上下面两行代码让浏览器在后台静默执行,由于我们要手动验证码所以忽略 # self.option = webdriver.ChromeOptions() # self.option.add_argument('headless') self.browser = webdriver.Chrome() # 获取cookies,子类到时候自行重写,不然报错 def new_cookies(self, username, password): raise NotImplementedError #提取cookies中得name和value重新生产新字典,其他字段无用 def process_cookies(self, cookies): dict = {} for cookie in cookies: dict[cookie['name']] = cookie['value'] return dict # 运行函数 def run(self): # 导出所有得账号列表 account_usernames = self.account_db.usernames() cookies_usernames = self.cookies_db.usernames() # 遍历所有账号,找出没有cookies得账号 for username in account_usernames: if not username in cookies_usernames: password = self.account_db.get(username) print('正在生成cookies', '账号:', username, '密码----') result = self.new_cookies(username, password) time.sleep(10) # 这快利用我们cookies文件生成得状态码判断登录状态,登录正常得获取并保存cookies,错误得则删除账号 if result.get('status') == 1: cookies = self.process_cookies(result.get('content')) print('成功获取到cookies', cookies) if self.cookies_db.set(username, json.dumps(cookies)): print('成功保存cookies') elif result.get('status') == 2: print(result.get('content')) if self.account_db.delete(username): print('成功删除错误账号') else: print(result.get('content')) else: print('所有账号都已成功获取cookies') def close(self): try: print('关闭浏览器') self.browser.close() del self.browser except TypeError: print('浏览器关闭失败')