selenium中使用cookie登录

✍转载自:https://www.cnblogs.com/CYHISTW/p/11685846.html

前言

爬虫方向的小伙伴们都知道网页爬虫经常遇到的问题就是登录账户,有些简单的网站我们可以简单的send
key来输入账户密码就可以登录,但是有很多网站需要验证码之类的就不太好用了,这时候就体现到了cookie登录的优点了,前段时间网上搜了搜,发现没有什么完整的教程,本文就使用selenium来cookie登录为例做一个简单的教程。

环境准备

  • python3
  • selenium
  • chromedriver

代码编写

这次就以 百度 为例,www.baidu.com 首先使用 selenium 模拟打开百度,看一下未登录是什么样子

》代码如下:

from selenium import webdriver

# 填写webdriver的保存目录
driver = webdriver.Chrome()

# 记得写完整的url 包括http和https
driver.get('https://www.baidu.com')

结果如下图所示:
selenium中使用cookie登录_第1张图片
我们想要将网页变成登录后的样子,如下图:

登录账号后,那么我们该怎么获取cookie以达到登录效果呢?

我们可以直接使用F12查看当前网页的cookie,但是你会发现直接获取到的并不是那么好插入到selenium中,因为cookie在浏览器中实际是这个样子的:
selenium中使用cookie登录_第2张图片
它需要额外添加一些东西,那么我们该如何获取呢?其实也很简单,最简单的方法就是我们首先使用selenium手动登录一下然后获取cookie值保存到本地,之后再登陆的时候直接调用本地cookie就可以了

---------------------------------------------------------------------

怎么获取呢?selenium有一个 get_cookies() 函数可以帮我们获取当前网页的cookie值,所以我们首先编写一个 getcookies.py 文件来获取cookie值。

1️⃣ 在getcookies.py中编写如下代码:

from selenium import webdriver
import time
import json

# 填写webdriver的保存目录
driver = webdriver.Chrome()

# 记得写完整的url 包括http和https
driver.get('https://www.baidu.com')

# 程序打开网页后20秒内 “手动登陆账户” 
time.sleep(20)

with open('cookies.txt','w') as f:
    # 将cookies保存为json格式
    f.write(json.dumps(driver.get_cookies()))

driver.close()

运行程序后如下图 点击 登录 输入账号密码【程序内写的20秒完成操作,因为20秒后程序将获得cookie
selenium中使用cookie登录_第3张图片
现在发现项目目录下已经有了一个名称为 cookies.txt 的文件 ,现在我们已经将cookies保存到了本地,现在我们来编写程序使用cookies

2️⃣创建addcookies.py 文件,编写如下内容:

from selenium import webdriver
import time
import json

# 填写webdriver的保存目录
driver = webdriver.Chrome()

# 记得写完整的url 包括http和https
driver.get('https://www.baidu.com')

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

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

运行后,有小伙伴可能会发现出现报错,在插入cookie的时候 有返回如下错误:
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'

这个 expiry 是什么呢? 它是cookie生命周期,也就是失效时间,为什么在这里会报错呢?我们有两种解决办法:

  • 方法1——将expiry类型变为int(其实不太清楚为什么变为int就可以)
  • 方法2——删除该字段

3️⃣重新编写addcookies.py 代码:

from selenium import webdriver
import json

# 填写webdriver的保存目录
driver = webdriver.Chrome()

# 记得写完整的url 包括http和https
driver.get('https://www.baidu.com')

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

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

    # 方法1 将expiry类型变为int
    for cookie in cookies_list:
        # 并不是所有cookie都含有expiry 所以要用dict的get方法来获取
        if isinstance(cookie.get('expiry'), float):
            cookie['expiry'] = int(cookie['expiry'])
        driver.add_cookie(cookie)

    # 方法2删除该字段
    # for cookie in cookieslist:
    #     # 该字段有问题所以删除就可以 
    #     if 'expiry' in cookie:
    #         del cookie['expiry']
    #     driver.add_cookie(cookie)

第二种方法比较简单点,我自己也用第二种。

这时候发现没有报错了,可以发现,怎么还是登录之前的页面啊? 为什么cookies插入成功了却不是登陆后的页面?

这时,只需要在最终代码后面添加如下代码:driver.refresh() 让浏览器自动刷新,即可显示登录后的页面了。

你可能感兴趣的:(爬虫,python,selenium,cookie)