验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的。
目前最快速解决的三个手段:
- 去掉验证码:比较适合新开发但未上线的系统。
- 设置万能码:比较适合已经上线使用的系统。
- 通过添加登录cookie来绕过验证码。
本文以课堂派网站为例,介绍通过添加登录cookie的方式来绕过验证码,本方法只适用于需要记住登录状态的网站。
一、添加cookie的方法
1)driver.add_cookie(cookie_dict)方法中的参数是cookie_dict,说明该参数是字典类型。
2)源码介绍:
add_cookie(self, cookie_dict)
Adds a cookie to your current session.
:Args:
- cookie_dict: A dictionary object, with required keys - "name" and "value";
optional keys - "path", "domain", "secure", "expiry"
Usage:
driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
二、cookie的组成结构
通过get_cookie(name)方法获取到的cookie信息主要包含以下属性:
cookie ={u'domain': u'.cnblogs.com',
u'name': u'.CNBlogsCookie',
u'value': u'xxxx',
u'expiry': 1491887887,
u'path': u'/',
u'httpOnly': True,
u'secure': False}
# domain:服务器域名
# name:cookie的名称
# value:cookie的的值,是动态生成的
# expiry:cookie的有效终止日期
# path:path属性定义了哪些路径下的页面可获取服务器设置的cookie信息
# httpOnly:防脚本攻击
# secure:在cookie中添加该属性,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的cookie。当前这种协议只有一种,即为HTTPS。
三、获取cookies并保存在本地
from selenium import webdriver
import time
import json
driver = webdriver.Chrome()
driver.get("https://www.ketangpai.com/User/login.html")
# 手动登录
time.sleep(20)
# 获取所有cookie信息
dictCookies = driver.get_cookies()
# 将cookie列表转换成字符串
jsonCookies = json.dumps(dictCookies)
# 将cookie列表字符串保存到本地文件中
with open('cookies.txt', 'w') as f:
f.write(jsonCookies)
print('cookie列表字符串保存成功!')
查看本地保存的所有cookie信息:
四、加载本地保存的cookies并访问网页
from selenium import webdriver
import json
driver = webdriver.Chrome()
# 读取保存在本地文件中的cookie列表字符串
with open('cookies.txt', 'r', encoding='utf8') as f:
listCookies = json.loads(f.read())
# 添加cookie
for cookie in listCookies:
cookie_dict = {
'domain': 'www.ketangpai.com',
'name': cookie.get('name'),
'value': cookie.get('value'),
"expires": '',
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False
}
driver.add_cookie(cookie_dict)
# 访问网页
driver.get("https://www.ketangpai.com/#/main")
运行结果后发现报错了:Message: invalid cookie domain。
五、修改代码,解决问题
这篇文章提供了一个解决方案:https://www.cnblogs.com/CoolJayson/p/7421013.html。
"技术提示:必须先加载网站,这样Selenium才能知道cookie属于哪个网站,即使先加载网站的行为对我们没任何用处"。
只需在代码中添加下面一句即可,这个url填 "https://www.ketangpai.com/User/login.html" 或 "https://www.ketangpai.com/Main/index.html" 都行,只要是同一个domain就行。
from selenium import webdriver
import json
driver = webdriver.Chrome()
# 添加下一行代码,解决invalid cookie domain报错
driver.get("https://www.ketangpai.com/User/login.html")
# 读取保存在本地文件中的cookie列表字符串
with open('cookies.txt', 'r', encoding='utf8') as f:
listCookies = json.loads(f.read())
# 添加cookie
for cookie in listCookies:
cookie_dict = {
'domain': 'www.ketangpai.com',
'name': cookie.get('name'),
'value': cookie.get('value'),
"expires": '',
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False
}
driver.add_cookie(cookie_dict)
# 访问网页
driver.get("https://www.ketangpai.com/#/main")
再次执行代码,页面跳转成功。
以上代码最难的部分就是往浏览器里面添加cookie的地方,获取到的cookies是以列表的形式储存的,而列表里的元素是字典,每一个字典都是一个cookie,所以我们需要遍历列表,将买一个cookie信息以字典形式往浏览器中添加。