利用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中的多线程编程
Apr 09 Python
Python中的fileinput模块的简单实用示例
Jul 09 Python
Python 安装setuptools和pip工具操作方法(必看)
May 22 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
每天迁移MySQL历史数据到历史库Python脚本
Apr 13 Python
实例讲解Python爬取网页数据
Jul 08 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
Numpy数组array和矩阵matrix转换方法
Aug 05 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 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
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
浅析jquery的作用与优势
2013/12/02 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python实现单词翻译功能
2017/06/06 Python
使用python实现ANN
2017/12/20 Python
分析Python读取文件时的路径问题
2018/02/11 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
建筑工程自我鉴定
2013/10/18 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
工厂会计员职责
2014/02/06 职场文书
车辆转让协议书
2014/04/15 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
青年文明号汇报材料
2014/12/23 职场文书
土地租赁协议书
2015/01/29 职场文书
工作年限证明模板
2015/06/15 职场文书
运动会主持词大全
2015/07/02 职场文书
导游词之西安骊山
2019/12/03 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
JAVA API 实用类 String详解
2021/10/05 Java/Android