前言
随着Python3的普及,Selenium3也跟上了行程。而Selenium3最大的变化是去掉了Selenium RC,另外就是Webdriver从各自浏览器中脱离,必须单独下载。本文就来介绍了关于selenium 3.7+python3实现添加cookie模拟登陆的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
一、背景介绍
最近做一个爬虫项目,用selenium调用浏览器去获取渲染后的源码,但是每次登陆都需要手机验证,这真的是头痛啊,这种验证方式不要想着去破解,还是老老实实用手机收验证码去吧!反正我是不知道这种验证方式还能破解!难道就没有其他办法了吗?
有,那就是模拟登陆!这样最起码不用没测试一次就登陆验证一次。
这里要说一下的就是,网上很多关于webdriver 添加cookie的教程,基本百分之80都是有问题的。反正我是找了N多的帖子都没有一个是正确的。
二、 添加cookie方法:driver.add_cookie()
1.add_cookie(cookie_dict)
方法里面参数是cookie_dict,说明里面参数是字典类型。
2.add_cookie源码。
从源码中我们可以看出,add_cookie方法接受一个字典,字典中包含name,value,path,domain,secure,expiry,但是这个源码容易误导人,那就是cookie参数没有给全。
网上很多教程给的代码cookie参数是没给够的,根本就跑不起来。
3. add_cookie接收的字典格式。
正确的格式:
1
2
3
4
5
6
7
8
9
10
11
|
cookie = {
# "domain": ".58.com", #Firefox浏览器不能写domain,如果写了会报错,谷歌需要写否则也是报错,这里就是一个坑。其他浏览器没测试不知道情况。
'name': name,
'value': value,
"expires": "",
'path': '/',
'httpOnly': False,
'HostOnly': False,
'Secure': False,
}
|
- name:cookie的名称
- value:cookie对应的值,动态生成的
- domain:服务器域名
- expiry:Cookie有效终止日期
- path:Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
- httpOnly:防脚本攻击
- secure:在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时
为什么要构造成这样子,其实我们看下浏览器保存的cookie格式就明白了。下图就是谷歌浏览器的cookie 的截图。
三 ,我们举个例子看下是否真的写成功了:
第一次访问的的时候去获取名字叫hello的cookie 是没有的,add_cookie后再去访问,第二次访问就拿到了hello。说明已经写进去了。
四、项目实战。
能不能用?好不好用?怎么用?,用项目来说话,模拟登陆百度。!
目标:
1.手动登录一次后,只要在cookie 有效期内无需重复登录。
2.访问浏览记录。
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#!coding=utf-8
import time
from selenium import webdriver
import pickle
class BaiduSpider( object ):
def __init__( self ,username,password):
self .username = username
self .password = password
self .driver = webdriver.Chrome()
self .driver.get(url = 'http://www.baidu.com' )
self .set_cookie()
self .is_login()
def is_login( self ):
'''判断当前是否登陆'''
self .driver.refresh()
html = self .driver.page_source
if html.find( self .username) = = - 1 : #利用用户名判断是否登陆
# 没登录 ,则手动登录
self .login()
else :
#已经登录 尝试访问搜索记录,可以正常访问
self .driver.get(url = 'http://i.baidu.com/my/history' )
time.sleep( 30 ) # 延时看效果
def login( self ):
'''登陆'''
time.sleep( 60 ) #等待手动登录
self .driver.refresh()
self .save_cookie()
def save_cookie( self ):
'''保存cookie'''
# 将cookie序列化保存下来
pickle.dump( self .driver.get_cookies(), open ( "cookies.pkl" , "wb" ))
def set_cookie( self ):
'''往浏览器添加cookie'''
'''利用pickle序列化后的cookie'''
try :
cookies = pickle.load( open ( "cookies.pkl" , "rb" ))
for cookie in cookies:
cookie_dict = {
"domain" : ".baidu.com" , # 火狐浏览器不用填写,谷歌要需要
'name' : cookie.get( 'name' ),
'value' : cookie.get( 'value' ),
"expires" : "",
'path' : '/' ,
'httpOnly' : False ,
'HostOnly' : False ,
'Secure' : False }
self .driver.add_cookie(cookie_dict)
except Exception as e:
print (e)
if __name__ = = '__main__' :
BaiduSpider( 'usename' , '!!!!' ) # 你的百度账号,密码
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/huangguifeng/p/7858619.html