利用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 正则表达式 概述及常用字符
May 04 Python
Python使用代理抓取网站图片(多线程)
Mar 14 Python
Python实现定时任务
Feb 08 Python
python基于Selenium的web自动化框架
Jul 14 Python
为什么从Python 3.6开始字典有序并效率更高
Jul 15 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
Dec 12 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
在python中使用nohup命令说明
Apr 16 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
python3判断IP地址的方法
Mar 04 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导出oracle库的php代码
2009/04/20 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
Python中文件操作简明介绍
2015/04/13 Python
Python常用算法学习基础教程
2017/04/13 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
一封普通求职者的求职信
2013/11/20 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
百年校庆感言
2015/08/01 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python