Selenium webdriver的无头模式(headless)可能导致cookies内容缺失,以及解决措施

2023-11-07

无头模式(headless)是selenium的webdriver浏览器驱动的一项功能,允许浏览器不出现而仍可访问网页,并与之交互,这对于运行自动化测试或网络抓包大有用处,因为运行速度更快、占用资源更少。

但是笔者发现在无头模式下运行时,浏览器访问某些网站产生的cookies内容可能与在正常模式(非无头模式)下略有不同。因为某些网站使用技术来检测是否被无头浏览器访问,并可能通过设定不同的 cookie 或以其他方式表现不同来做出响应。

为了说明这种差异,我们可以使用 Python 中的 Selenium WebDriver 库运行一个简单的实验。 首先,我们将创建两个 Chrome 浏览器实例——一个在无头模式下,另一个在正常模式下:

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


# 初始化无头模式(headless)的webdriver
options = Options()
options.add_argument('--headless')
driver_headless = webdriver.Chrome(options=options)
# 设置window.navigator.webdriver为false
driver_headless.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => False}) "})
# 打开一个网站,输出cookies
driver_headless.get('http://。。。。。。')
sleep(3)
cookies_headless = driver_headless.get_cookies()
keys_headless = set([cookie['name'] for cookie in cookies_headless])
driver_headless.quit()


# 初始化正常模式的webdriver
options2 = Options()
# 取消chrome受自动控制提示
options2.add_experimental_option('useAutomationExtension', False)
options2.add_experimental_option('excludeSwitches', ['enable-automation'])
driver_normal = webdriver.Chrome(options=options2)
# 设置window.navigator.webdriver为false
driver_normal.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => False}) "})
# 打开同一个网站,输出cookies
driver_normal.get('http://。。。。。。')
sleep(3)
cookies_normal = driver_normal.get_cookies()
keys_normal = set([cookie['name'] for cookie in cookies_normal])
driver_normal.quit()


# 两相比较
keys_only_in_headless = keys_headless - keys_normal
keys_only_in_normal = keys_normal - keys_headless

if keys_only_in_headless:
    print(f'无头模式(headless)多出来的Cookie名称是: {keys_only_in_headless}')
if keys_only_in_normal:
    print(f'正常模式多出来的Cookie名称是: {keys_only_in_normal}')
if not keys_only_in_headless and not keys_only_in_normal:
    print('无头模式和正常模式的cookies都一样。')

运行结果截图:

我测试了分别采用无头模式和正常模式访问同一个网站的链接,得出的cookies不一样。无头模式情况下的cookies比正常模式缺失两项内容:AlteonP、JSessionID。

我后续的操作是需要把selenium的cookies内容导出至requests库的session使用,若使用无头模式下的cookie,再用requests库的get、post访问该网站时都报错(status_code会出现400、403、412等非正常代码)。

众所周知requests库的get、post访问一个网站链接获取得到的cookies内容本来就稀缺,只有selenium的webdriver打开网站才能得到丰富的cookies,因此要从selenium的cookies导出cookies给requests库使用是非常有必要的。要让selenium的无头模式也能获取正常模式的cookies,下面是我的两个解决思路:

1、添加user-agent

在options那几行里插入下面两行代码:

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
options.add_argument(f'user-agent={user_agent}')

也许大家和我一样都觉得Selenium的webdriver已经自动附带user-agent而不需要重复添加。但意想不到的是,无头模式访问某些网站,网站仍会检测到selenium是在做爬虫动作,故给出的cookies内容少之又少,跟requests的get获取的cookies相差无几。所以在尝试手动添加user-agent后,无头模式获取的cookies内容变得丰富起来,这个办法看似老土,但非常管用。

2、设置浏览器窗口大小

如果第一个解决方法行不通,可试试设置浏览器窗口大小,尽管无头模式下浏览器是无形的,但也许通过设置窗口大小可以瞒过某些网站的检测。

options.add_argument("--window-size=1920,1050") 

接下来就可以导出Selenium的cookies给requests使用了。

from requests.cookies import RequestsCookieJar

cookies = driver.get_cookies()
jar = RequestsCookieJar()
for cookie in cookies:
    jar.set(cookie['name'], cookie['value'])

se = requests.Session()
se.cookies = jar
se.headers.update({'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'})

res = se.get('http://。。。。。。', headers=headers)
assert res.status_code==200
res.encoding = 'utf-8'
print(res.text)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium webdriver的无头模式(headless)可能导致cookies内容缺失,以及解决措施 的相关文章

随机推荐

  • 物联网场景中,我们如何选择时序数据库 ?

    如今时序数据的应用场景十分广泛 许多类型的数据都是时间序列数据 金融市场交易 传感器测量 水冷 高温 地震 服务器监控 CPU 内存 磁盘 资源消耗 能源 电力 人体健康 心率 血氧浓度 网络访问 通过保留数据固有的时间序列性质 我们可以记
  • mysql:ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value:

    发现某个组件的表单输入报错 Error ER TRUNCATED WRONG VALUE FOR FIELD Incorrect string value xE6 x88 x91 xE4 xBB xAC for column content
  • 【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先

    文章目录 一 题目 二 解法 三 完整代码 所有的LeetCode题解索引 可以看这篇文章 算法和数据结构 LeetCode题解 一 题目 二 解法 思路分析 本题和这道题类似 算法与数据结构 236 LeetCode二叉树的最近公共祖先
  • Linux下Samba的配置

    参考 http www cnblogs com mchina archive 2012 12 18 2816717 html 前言 为了实现windows 和 Linux以及其他操作系统之间的资源共享 软件商推出nfs 和samba两种解决
  • Air101

    目录 1 合宙Air101 固件编译可参考 PinOut V2 1092400 管脚映射表 PinOut V2 1091800 2 Air103 最新固件下载 固件编译可参考 PinOut V3 21112201 管脚映射表 资料链接 Pi
  • Solid JS基础

    Solid js 用于构建用户界面的声明式 高效且灵活的 JavaScript 库 您可以在 官方教程 中尝试下面提到的部分例子 本文引用并简化了官方教程中的部分例子 本文讲述部分 solid 主要内容 更多详细内容 移步 Solid AP
  • 编码器的使用

    首先来看一下增量式编码器的输出信号和它的信号倍频技术 增量式编码器输出的脉冲波形信号形式常见的有两种 一种是占空比50 的方波 通道A和B相位差为90 另一种则是正弦波这类模拟信号 通道A和B相位差同样为90 对于第1种形式的方波信号 如果
  • MATLAB量化浮点数

    在做算法设计和验证时 常在matlab进行浮点验证 然后量化后在用在FPGA上 对于类似与FIR这些滤波器系数 matlab直接可以export出来 但是在验证麦克风或者ADC出来的24bit补码这类时常常需要使用matlab生成定点数进行
  • 有关DHCP、链路聚合、NAT、ACL、Telnet配置小综合实验

    实验需求 1 局域网中存在VLAN10 VLAN20 VLAN30和VLAN40四个部门 IP网段 应192 168 10 0 24 192 168 20 0 24 192 168 30 0 24 192 168 40 0 24 2 业务V
  • Linux虚拟机 Ubuntu16 cheese命令打开摄像头黑屏,以及mjpg-stream框架不显示视频界面。

    在Linux虚拟机 Ubuntu16打开笔记本的摄像头时 用 ubuntu16的cheese命令显示黑屏 如下图 解决方法 1 查看虚拟机是否已经已连接上摄像头 显示断开连接 连接主机 D 则虚拟机已连接上摄像头 2 确认摄像头 笔记本的摄
  • 搭建环境【2】windows主机和ubuntu互传文件的4种方法

    我的ubuntu系统是安装在 VMware 虚拟机中的 两者之间经常要互传文件 下面介绍4种常用的互传文件方法 1 共享文件夹方式互传 在虚拟机中需要开启共享文件夹的功能 首先虚拟机中的ubuntu要求是已经开机了的状态 然后进行设置 虚拟
  • 山东轻工业学院高校俱乐部主席“我和我的CSDN高校俱乐部”

    今天天气不错 上午收到了CSDN邮寄过来的2012年度优秀主席证书以及奖品 心情也不错 感谢CSDN教育事业部全体同事一年来对我们工作的支持与帮助 同时也感谢那些奋战在一线的兄弟姐妹们 你们为轻工学院CSDN高校俱乐部所做的一切 我永远铭记
  • ThreadLocal - ThreadlMap与弱引用

    ThreadLocal源码 在看ThreadLocal源码的时候 其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc static class ThreadLocalMap static class Entr
  • C++ string字符串修改和替换方法详解

    字符串内容的变化包括修改和替换两种 本节将分别讲解字符串内容的修改和字符串内容的替换 字符串内容的修改 可以通过使用多个函数修改字符串的值 例如 assign operator erase 交换 swap 插入 insert 等 另外 还可
  • 使用Guava RateLimiter限流以及源码解析

    前言 在开发高并发系统时有三把利器用来保护系统 缓存 降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时 需要暂时屏蔽掉 待高峰或者问题解决后再打开 限流 限流的目的是通过对并发
  • win10 graphedit存储的路径

    如果安装郭windows SDK的话 可能的存储位置为C Program Files x86 Windows Kits 10 bin x86 C Program Files x86 Windows Kits 10 bin x64
  • 【C语言学习教程---2】C语言的数据类型

    事物的难度远远低于对事物的恐惧 上一篇文章已经介绍说明了Visual C 的安装和使用 链接如下 C语言学习教程 1 VC 6 0的安装和创建简单C语言工程文件教程 文末有程序代码免费的获取方式 本篇文章开始正式讲解和介绍C语言的知识 在学
  • 安装破解版的edraw max

    一 简介 project是一款好用的项目管理工具 二 安装过程 1 下载安装包 安装软件 安装后先不要运行 https pan baidu com share init surl gKfohSW8XEn 9cYLwnJwdQ h3um 2
  • git:git clone -b提示remote branch master not found in upstream origin

    问题 如标题 解决办法 检查下分支名是否写错了 git创建时有时候不一定有master分支 而是main分支 需要注意
  • Selenium webdriver的无头模式(headless)可能导致cookies内容缺失,以及解决措施

    无头模式 headless 是selenium的webdriver浏览器驱动的一项功能 允许浏览器不出现而仍可访问网页 并与之交互 这对于运行自动化测试或网络抓包大有用处 因为运行速度更快 占用资源更少 但是笔者发现在无头模式下运行时 浏览