Python+Selenium4+Edge实现携带cookie免登录绕过验证访问网站

Python+Selenium4+Edge实现携带cookie免登录绕过验证访问网站

我们如果要对网页进行爬虫经常遇到的问题就是登录账户,有些简单的网站我们可以输入账户密码就可以登录,但是有很多网站需要验证码之类的就不太好用了,也可以通过yolo等AI识别去识别图片实现验证码点击,但是比较麻烦,这时候就体现到了cookie登录的优点了,本文将使用Selenium4对52pojie携带cookie登录为例做一个简单的教程

本文使用的是Edge作为浏览器驱动,如需要使用别的浏览器可参考我的另外一篇文章

环境准备

Python 3.10

Edge

selenium 4

代码编写

首先我我需要实现的功能是携带 cookie 直接登陆52pojie,因为这个网站是需要验证码的,因此想要绕过验证码登陆,我们需要携带 cookie 直接登陆就可以绕过验证了,因为 cookie 不是简单的放在请求头就可以的,我们先进入网站然后登陆账号看看 F12 中 cookie 在浏览器中的样子:

它需要额外添加一些东西,那么我们该如何获取呢?其实也很简单,最简单的方法就是我们首先使用selenium4手动登录一下然后获取cookie值保存到本地,之后再登陆的时候直接调用本地cookie就可以了。

获取cookies

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

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

import json

import time

from selenium import webdriver

from selenium.webdriver.edge.service import Service as EdgeService

from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))

# 要登录的网站

driver.get("https://www.52pojie.cn/")

# 程序打开网页后20秒内 “手动登陆账户”

time.sleep(20)

# 生成cookies.txt文件用来保存cookies

with open('cookies.txt', 'w') as f:

# 将cookies保存为json格式

f.write(json.dumps(driver.get_cookies()))

# 关闭浏览器驱动

driver.close()

运行程序后会打开页面,我们需要在20秒内登陆好账户,然后等20秒后selenium自动获取 cookie 。

这时候 cookies.txt 已经生成了,我们可以看看里面 cookies 有没有保存。

使用cookies

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

import json

import time

from selenium import webdriver

from selenium.webdriver.edge.service import Service as EdgeService

from webdriver_manager.microsoft import EdgeChromiumDriverManager

# 驱动路径设置

driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))

# 要登录的网站

driver.get("https://www.52pojie.cn/")

# 首先清除由于浏览器打开已有的cookies

driver.delete_all_cookies()

# 读取cookies

with open('cookies.txt', 'r') as f:

# 使用json读取cookies 注意读取的是文件 所以用load而不是loads

cookies_list = json.load(f)

for cookie in cookies_list:

# 添加cookies

driver.add_cookie(cookie)

# 刷新页面

driver.refresh()

# 看看浏览器登陆情况 后面可以删除这行代码

time.sleep(5)

# 关闭驱动

driver.close()

运行图:

运行后,有小伙伴可能会发现出现报错,在插入cookie的时候 有返回如下错误:

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'

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

方法1——将expiry类型变为int(其实不太清楚为什么变为int就可以)

方法2——删除该字段

如果有报错的话,推荐使用第二种方法,比较简单。

重新编写addcookies.py 代码:

import json

import time

from selenium import webdriver

from selenium.webdriver.edge.service import Service as EdgeService

from webdriver_manager.microsoft import EdgeChromiumDriverManager

# 驱动路径设置

driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))

# 要登录的网站

driver.get("https://www.52pojie.cn/")

# 首先清除由于浏览器打开已有的cookies

driver.delete_all_cookies()

# 读取cookies

with open('cookies.txt', 'r') as f:

# 使用json读取cookies 注意读取的是文件 所以用load而不是loads

cookies_list = json.load(f)

# 正常方法

# for cookie in cookies_list:

# # 添加cookies

# driver.add_cookie(cookie)

# 方法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 cookies_list:

# 该字段有问题所以删除就可以

if 'expiry' in cookie:

del cookie['expiry']

driver.add_cookie(cookie)

# 刷新页面

driver.refresh()

# 看看浏览器登陆情况 后面可以删除这行代码

time.sleep(5)

# 关闭驱动

driver.close()

相关推荐

掼蛋是谁发明的?官方认证:这4人!
btbt365me

掼蛋是谁发明的?官方认证:这4人!

📅 12-06 👁️ 1802
陌陌养号全攻略:从个人资料到群组互动,建立社交网络的最佳实践
冬季刮什么风好钓鱼?南风和东南风最好钓,西风和西南风最难钓!
你的 X60 曲屏版一手好功力
GBT36507-2018

你的 X60 曲屏版一手好功力

📅 08-20 👁️ 8236
麻将游戏种类繁多,究竟有哪些不同的玩法?
「踊」字组词
GBT36507-2018

「踊」字组词

📅 10-18 👁️ 3312