selenium获取cookie并携带模拟登录

前言:

selenium获取cookie并携带模拟登录_第1张图片

有小伙伴可能会觉得明明F12在开发者选项里面就能获取到cookie信息为啥还要专门写一个程序去获取,这不多此一举嘛其实并不是哟,首先呢一般你直接登录之后得cookie信息都是不完整得只有一条而且大部分都是加密过得,哪怕我们假设它是完整得你直接复制之后selenium也接受不了,因为直接复制得格式不是selenium要求的你再去转换格式不得很麻烦呀

selenium获取cookie并携带模拟登录_第2张图片

不多废话哈切入正题,这次测试得目标网站为QQ空间     https://mail.qq.com/

1、获取cookie信息 

先定义前面代码

from  selenium import webdriver
from selenium.webdriver import ChromeOptions   #这个包用来规避被检测的风险
import time  #延迟

option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
driver_path=r'驱动的路径' #定义好路径
driver=webdriver.Chrome(executable_path=driver_path,options=option) #初始化路径+规避检测

其实吧,QQ空间没啥好注意的地方,唯一需要注意的是这个登录框是在iframe里面,也就是嵌套得网页,如果你直接在原本的QQ空间网页定位元素是发现定位不到的。比如,我定位的账号输入框 :

selenium获取cookie并携带模拟登录_第3张图片

 selenium获取cookie并携带模拟登录_第4张图片

 这个时候我们需要切换到iframe去操作代码如下,如果不知道怎么切换的话可以看这位博主写的文章简单易懂好吧!(26条消息) selenium之 定位以及切换frame(iframe)_灰蓝-CSDN博客_selenium切换iframehttps://blog.csdn.net/huilan_same/article/details/52200586

def denglv():
    driver.get('https://mail.qq.com/')
    driver.implicitly_wait(10)   #避免加载太久报错
    time.sleep(1)
    driver.switch_to_frame("login_frame")  #切换到iframe去操作元素 

能看到这里的我觉得就不用讲咋定位元素了,如果有实在不懂的小伙伴可以搜索一下有很多博主写的都很好的,我这里直接贴后面的代码

def denglv():
    driver.get('https://mail.qq.com/')
    driver.implicitly_wait(10)
    time.sleep(1)
    driver.switch_to_frame("login_frame")
    zhanghao=driver.find_element_by_xpath('//input[@class="inputstyle"]').send_keys('QQ账号')  #输入账号
    time.sleep(2)
    mima=driver.find_element_by_xpath('//input[@type="password"]').send_keys('QQ密码') #密码
    # time.sleep(15)
    denglvs= driver.find_element_by_xpath('//input[@type="submit"]').click()  #点击登录按钮
    time.sleep(4)
    driver.refresh()   #刷新网页
    time.sleep(4)
    cookie=driver.get_cookies()  #获取cookie信息
    print(cookie)  #打印cookie信息

可以看到返回的cookie信息如下: 

好了,怎么获取说到这里接下来就是怎么登录了

2、携带cookie信息达到已登录的状态

我直接贴代码,我都是有写注释的小伙伴自己看下哈

def denglv2():
    driver.get('https://mail.qq.com/')
    driver.implicitly_wait(10)  # 如果网页没有加载完,避免出现加载超时得报错最多让他加载十秒
    # driver.delete_all_cookies() #清空之前得cookie信息
    cookies =   #这里直接复制上面获取到得cookie信息粘贴就行了

    for cookie in cookies:
        if 'expiry' in cookie:  # 有的cookie里面有这个参数,有的没有。有的话,需要做处理。
            del cookie['expiry']  
        driver.add_cookie(cookie)  # 传入cookie
    driver.refresh()  # 刷新页面
    driver.get('https://mail.qq.com/')   #重新请求页面

这里我说一下,为什么要对expiry做处理,因为有些网站是判断这个值看下是否过期,过期了就没法登录,还有的需要为切换为整形才可以,具体什么原因嘛,暂时我也不是很清楚,有懂的朋友可以说一下

最后也是 登录成功呀

完整源代码如下:

from  selenium import webdriver
from selenium.webdriver import ChromeOptions   #这个包用来规避被检测的风险
import time  #延

option = webdriver.ChromeOptions()
option.add_experimental_option('useAutomationExtension', False)
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver_path = r'驱动路径'  # 定义好路径
driver = webdriver.Chrome(executable_path=driver_path,options=option)  # 初始化路径+规避检测
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})


def denglv():
    driver.get('https://mail.qq.com/')
    driver.implicitly_wait(10)
    time.sleep(1)
    driver.switch_to_frame("login_frame")
    zhanghao=driver.find_element_by_xpath('//input[@class="inputstyle"]').send_keys('QQ账号')  #输入账号
    time.sleep(2)
    mima=driver.find_element_by_xpath('//input[@type="password"]').send_keys('QQ密码') #密码
    # time.sleep(15)
    denglvs= driver.find_element_by_xpath('//input[@type="submit"]').click()  #点击登录按钮
    time.sleep(4)
    driver.refresh()   #刷新网页
    time.sleep(4)
    cookie=driver.get_cookies()  #获取cookie信息
    print(cookie)  #打印cookie信息

def denglv2():
    driver.get('https://mail.qq.com/')
    driver.implicitly_wait(10)  # 如果网页没有加载完,避免出现加载超时得报错最多让他加载十秒
    # driver.delete_all_cookies() #清空之前得cookie信息
    cookies =   # 这里直接复制上面获取到得cookie信息粘贴就行了

    for cookie in cookies:
        if 'expiry' in cookie:  # 有的cookie里面有这个参数,有的没有。有的话,需要做处理。
            del cookie['expiry']  
        driver.add_cookie(cookie)  # 传入cookie
    driver.refresh()  # 刷新页面
    driver.get('https://mail.qq.com/')


if __name__ == '__main__':
    denglv()      #调用函数
    # denglv2()

声明

本文仅限于做技术交流学习,请勿用作任何非法商用!

你可能感兴趣的:(python,selenium,chrome,python)