selenium自动化操作之六:基于cookies绕过验证码登录
2019-08-20 本文已影响0人
52d19f475fe5
cookies是储存在用户本地终端上的数据,可以叫做浏览器缓存。cookies可以帮助Web站点保存有关访问者的信息,方便用户的访问。如记住用户名密码实现自动登录
1 webdriver操作cookies的方法
- get_cookies():获取所有的 cookie 信息
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
for cookie in driver.get_cookies():
print(cookie)
driver.quit()
运行结果:
{'domain': 'baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '1464_21114_29522_29518_29098_29568_29220_29641'}
{'domain': 'baidu.com', 'expiry': 3713749787.353785, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '8A5ED58DED579E5012FEFE654B59E182'}
{'domain': 'baidu.com', 'httpOnly': False, 'name': 'delPer', 'path': '/', 'secure': False, 'value': '0'}
{'domain': 'baidu.com', 'expiry': 3713749787.353819, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1566266135'}
{'domain': 'baidu.com', 'expiry': 1566352540.633414, 'httpOnly': False, 'name': 'BDORZ', 'path': '/', 'secure': False, 'value': 'B490B5EBF6F3CD402E515D22BCDA1598'}
{'domain': 'www.baidu.com', 'expiry': 1567130140, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'}
{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '0'}
{'domain': 'baidu.com', 'expiry': 3713749787.353728, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '8A5ED58DED579E5012FEFE654B59E182:FG=1'}
-
get_cookie(name):获取特定
name
的某个cookie
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.get_cookie('BAIDUID'))
driver.quit()
运行结果:
{'domain': 'baidu.com', 'expiry': 3713751770.625061, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': 'A1BFF6D63CC791A6F1F3978B864FABAA:FG=1'}
- delete_all_cookies() :删除所有 cookie 信息
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.delete_all_cookies()
cookies = driver.get_cookies()
print(cookies)
driver.quit()
运行结果:
[]
-
delete_cookie(name) :删除特定
neme
的部分 cookie 信息
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.get_cookie('BAIDUID'))
driver.delete_cookie('BAIDUID')
print(driver.get_cookie('BAIDUID'))
driver.quit()
运行结果:
{'domain': 'baidu.com', 'expiry': 3713752514.478564, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': 'A8DC2AEFA3061036E6E502F17855D79A:FG=1'}
None
- add_cookie(cookie_dict):添加 cookie,必须有 name 和 value 值
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.delete_all_cookies()
driver.add_cookie({'name': 'python', 'value': 'selenium'})
cookies = driver.get_cookies()
print(cookies)
driver.quit()
运行结果:
[{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'python', 'path': '/', 'secure': True, 'value': 'selenium'}]
2 基于cookies绕过验证码登录
我们可以在用户登录之前,通过add_cookie()
方法将用户名密码写入浏览器cookie,然后刷新driver.refresh()
,将自动登录。例如下面的方式:
from selenium import webdriver
from time import sleep
# 访问 https://www.xxxx.cn/ 网站
driver = webdriver.Chrome()
driver.get("https://www.xxxx.cn/")
# 将用户名密码写入浏览器 cookie
driver.add_cookie({'name': 'Login_UserNumber', 'value': 'username'})
driver.add_cookie({'name': 'Login_Passwd', 'value': 'password'})
sleep(2)
driver.refresh()
sleep(3)
driver.quit()
使用 cookie 进行登录最大的难点是如何获得用户名密码的 name ,如果找到不到 name 的名字,就没办法向 value 中输用户名、密码信息。
我们可以通过 get_cookies()方法来获取登录的所有的 cookie 信息,从而进行找到用户名、密码的 name 对象的名字;如果做自动化测试,最简单的方法还是询问前端开发人员。
使用Cookie绕过百度验证码自动登录账户
1 人为登录,生成cookies
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
input('如果已登录,按enter键继续!')
for cookie in driver.get_cookies():
print(cookie)
driver.quit()
运行结果:
如果已登录,按enter键继续!
{'domain': 'baidu.com', 'expiry': 1825592198.751748, 'httpOnly': True, 'name': 'BDUSS', 'path': '/', 'secure': False, 'value': 'M0ZHFQSmZTYnJyYlBKNEl2YVpOTktQaHZRbHJFRndKaHhXcn5ucW5VR0F6SVJkSVFBQUFBJCQAAAAAAAAAAAEAAAC1tOJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA~XV2AP11dUj'}
{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'}
{'domain': 'baidu.com', 'expiry': 1566478562.822935, 'httpOnly': False, 'name': 'BDORZ', 'path': '/', 'secure': False, 'value': 'B490B5EBF6F3CD402E515D22BCDA1598'}
{'domain': 'www.baidu.com', 'expiry': 1567256200, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'}
{'domain': 'baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '1454_21081_29522_29519_29098_29568_29221'}
{'domain': 'baidu.com', 'expiry': 3713875809.402672, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1566392156'}
{'domain': 'baidu.com', 'httpOnly': False, 'name': 'delPer', 'path': '/', 'secure': False, 'value': '0'}
{'domain': 'baidu.com', 'expiry': 3713875809.402645, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '41946DF98D70EF194684D248F4B5B638'}
{'domain': 'baidu.com', 'expiry': 3713875809.402578, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '41946DF98D70EF194684D248F4B5B638:FG=1'}
拿到记录用户名、密码等cookie信息
2 用Fiddler 4 抓包工具分析
用Fiddler 4 抓包发现,百度账号用户名、密码的name为BAIDUID
和BDUSS
3 百度账号登录成功的条件
分析发现,百度在账号登录后会生成一个记录用户名的标签,这样就可以用显示等待
的方式自动判断用户是否登录成功
4 用cookie登录
范例代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
import json
import time
class Spider(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.login_url = 'https://www.baidu.com'
self.driver.get(self.login_url)
def _login(self):
print('请手动登录百度账号!')
WebDriverWait(self.driver, 1000).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'span.user-name'))
)
print('登录成功!')
username = self.driver.get_cookie('BAIDUID')
password = self.driver.get_cookie('BDUSS')
user_cookie = {'name': 'BAIDUID', 'value': username['value']}
pass_cookie = {'name': 'BDUSS', 'value': password['value']}
cookies = [user_cookie, pass_cookie]
cookies_str = json.dumps(cookies)
f = open('cookies.txt', 'w')
f.write(cookies_str)
f.close()
def _add_cookies(self, cookies):
self.driver.delete_all_cookies()
for cookie in cookies:
self.driver.add_cookie(cookie)
time.sleep(3)
self.driver.refresh()
WebDriverWait(self.driver, 7).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'span.user-name'))
)
print('登录成功!')
def _check_cookies(self):
try:
if os.path.exists('cookies.txt'):
f = open('cookies.txt', 'r')
cookies_str = f.read()
f.close()
cookies = json.loads(cookies_str)
self._add_cookies(cookies)
else:
self._login()
except:
self._login()
def run(self):
self._check_cookies()
time.sleep(6)
self.driver.quit()
if __name__ == '__main__':
spider = Spider()
spider.run()