利用selenium 3.7和python3添加cookie模拟登陆的实现


Posted in Python onNovember 20, 2017

前言

随着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源码。

利用selenium 3.7和python3添加cookie模拟登陆的实现

从源码中我们可以看出,add_cookie方法接受一个字典,字典中包含name,value,path,domain,secure,expiry,但是这个源码容易误导人,那就是cookie参数没有给全。

网上很多教程给的代码cookie参数是没给够的,根本就跑不起来。

3. add_cookie接收的字典格式。 

正确的格式:

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 的截图。

利用selenium 3.7和python3添加cookie模拟登陆的实现

三 ,我们举个例子看下是否真的写成功了:

利用selenium 3.7和python3添加cookie模拟登陆的实现

 第一次访问的的时候去获取名字叫hello的cookie 是没有的,add_cookie后再去访问,第二次访问就拿到了hello。说明已经写进去了。

 四、项目实战。

能不能用?好不好用?怎么用?,用项目来说话,模拟登陆百度。!

目标:

1.手动登录一次后,只要在cookie 有效期内无需重复登录。

2.访问浏览记录。

示例代码

#!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','!!!!') # 你的百度账号,密码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python自动化工具日志查询分析脚本代码实现
Nov 26 Python
python计算牛顿迭代多项式实例分析
May 07 Python
Python多线程下载文件的方法
Jul 10 Python
python开发之for循环操作实例详解
Nov 12 Python
python xml解析实例详解
Nov 14 Python
Python简单的制作图片验证码实例
May 31 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
python selenium操作cookie的实现
Mar 18 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
python 实现客户端与服务端的通信
Dec 23 Python
Python 内存管理机制全面分析
Jan 16 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 #Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 #Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 #Python
python中urlparse模块介绍与使用示例
Nov 19 #Python
Python Flask-web表单使用详解
Nov 18 #Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 #Python
深入理解Python单元测试unittest的使用示例
Nov 18 #Python
You might like
咖啡与水的关系
2021/03/03 冲泡冲煮
收集的DedeCMS一些使用经验
2007/03/17 PHP
动易数据转成dedecms的php程序
2007/04/07 PHP
pw的一个放后门的方法分析
2007/10/08 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
2009/09/05 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python字符串,数值计算
2016/10/05 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
pytorch 求网络模型参数实例
2019/12/30 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
自动化专业毕业生自荐信
2013/11/01 职场文书