使用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()