python 模拟浏览器登录获取cookie_selenium3.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接收的字典格式。

正确的格式:

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.访问浏览记录。

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

如果你支持我,就扫扫我的红包,你领我几毛,我领几毛,也算是对我的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值