web ui自动化之使用cookie登录


前言

网页爬虫经常遇到的问题就是登录账户,有些简单的网站我们可以简单的send key来输入账户密码就可以登录,但是有很多网站需要验证码之类的就不太好用了,这时候就体现到了cookie登录的优点了。下面将介绍一下使用selenium来操作cookie


一、python中操作cookie的方法

1.获取当前会话中的所有cookies - get_cookies()

代码如下(示例):

driver.get('https://www.baidu.com')

print(driver.get_cookies())

2.返回指定name名称的Cookie信息 - get_cookie(name值)

名称指的是下图中的名称
在这里插入图片描述

代码如下(示例):

driver.get('https://www.baidu.com')

print(driver.get_cookie('BIDUPSID')) # 以百度为例,传入指定的cookie值,会获得这个cookie的相关信息

> 返回:{'domain': '.baidu.com', 'expiry': 3803198408, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '7BEE5AE370BED745E72662B0FE0030E2'}

3.添加cookie - add_cookie(cookie_dict)

代码如下(示例):

driver.get('https://www.baidu.com')

# 指定cookie
cookie = {'domain': '.www.baidu.com', 'httpOnly': False, 'name': 'sugstore', 'path': '/', 'secure': False, 'value': '0'}

# 添加cookie
driver.add_cookie(cookie)

# 添加后获取cookie
print(driver.get_cookies())

4.删除特定的cookie - delete_cookie(name)

代码如下(示例):

driver.get('https://www.baidu.com')

# 删除指定的cookie信息
driver.delete_cookie(cookie['domain'])

# 删除后获取cookie
print(driver.get_cookies())

5.删除所有的cookie - delete_all_cookies()

代码如下(示例):

driver.get('https://www.baidu.com')

# 删除所有的cookie信息
driver.delete_all_cookies() 

# 删除后获取cookie
print(driver.get_cookies())

二、网站实例 - 百度为例

1.获取cookie

获取cookie最简单的方法就是我们首先使用selenium手动登录一下网站,然后获取cookie值保存到本地,之后再登陆的时候直接调用本地cookie就可以了。

代码如下(示例):

# 编写的getcookies.py文件
from selenium import webdriver # 导入webdriver驱动
import time 
import json

driver.maximize_window()  # 将窗口最大化
driver.get('https://www.baidu.com') # 访问百度网站

time.sleep(60) # 等待一段时间,该时间内手动操作登录网站

# 将cookie保存为json格式,此时会发现当前目录中多了一个cookies.txt的文件
with open('cookies.txt','w') as f:
    f.write(json.dumps(driver.get_cookies()))

driver.quit() # 退出网站

2.使用cookie

代码如下(示例):

# 编写的addcookies.py文件
from selenium import webdriver # 导入webdriver驱动
import time 
import json

driver.maximize_window()  # 将窗口最大化
driver.get('https://www.baidu.com') # 访问百度网站

driver.delete_all_cookies() # 清除由于浏览器打开已有的cookies

with open('cookies-bd.txt','r') as f:
    cookies_list = json.load(f) # 使用json读取cookie,注意读取的是文件,所以用load而不是loads

    for cookie in cookies_list:
        driver.add_cookie(cookie)
        
driver.refresh() # 刷新浏览器,刷新后发现网站已经通过cookie登录上了

3.常见问题

问题(1):
若expiry的值是小数,如:“expiry”: 2602060060.76,在运行后则会报错:

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid ‘expiry’

这个 expiry 是cookie的生命周期,也就是失效时间

针对该报错我们有两种解决办法,以下两种方式可根据自己喜好选择:
方法1:将expiry类型变为int(其实不太清楚为什么变为int就可以)
方法2:删除该字段

问题(2):获取的cookie信息不完整或是不准确
情况1:若使用的不是设置等待时间 手动登录网站 去获取cookie的方式,而是通过selenium自动化实现登录,去获取cookie的方式,需要在点击登录之后,driver.get_cookies()之前,增加一个等待时间,以避免退出太快获取的还是登录之前的cookie。这样cookie获取的不正确,后边会对登录造成影响(登录不上)
情况2:再三对比,确认自动化获取的cookie信息完整,但是添加cookie后还是登录不上。-- 使用手动登录的cookie信息,替换抓取到的cookie一些关键的值,如access_token、secure等。再次使用cookie登录就能成功了

综上所述,建议获取cookie信息的时候使用手动登录的方式,能避免一些犹未可知的问题

4.最终代码

代码如下(示例):

# 编写的addcookies.py文件
from selenium import webdriver # 导入webdriver驱动
import time 
import json

driver.maximize_window()  # 将窗口最大化
driver.get('https://www.baidu.com') # 访问百度网站

driver.delete_all_cookies() # 清除由于浏览器打开已有的cookies

with open('cookies-bd.txt','r') as f:
    cookies_list = json.load(f) # 使用json读取cookie,注意读取的是文件,所以用load而不是loads
    
	# 方法1:将expiry类型变为int
    for cookie in cookies_list:
        if isinstance(cookie.get('expiry'),float):
            cookie['expiry'] = int(cookie['expiry'])
        driver.add_cookie(cookie)

    # 方法2:删除该字段
    # for cookie in cookies_list:
    #     if 'expiry' in cookie:
    #         del cookie['expiry']
    #     driver.add_cookie(cookie)
    
driver.refresh() # 刷新一下浏览器,就可以在页面中看到已登录的状态了
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值