zoukankan      html  css  js  c++  java
  • 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','!!!!') # 你的百度账号,密码
    

      

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

  • 相关阅读:
    Codeforces Round #594 (Div. 2) ABC题
    Codeforces Round #596 (Div. 2) ABCD题
    数据结构实验5——二叉树
    数据结构实验4——字符串匹配
    数据结构实验3——用栈求解算术表达式
    友链
    Codeforces Round #577 (Div. 2)
    Educational Codeforces Round 70 (Rated for Div. 2)
    Codeforces Round #578 (Div. 2)
    2020 Multi-University Training Contest 10(待补
  • 原文地址:https://www.cnblogs.com/huangguifeng/p/7858619.html
Copyright © 2011-2022 走看看