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

这篇具有很好参考价值的文章主要介绍了Selenium webdriver的无头模式(headless)可能导致cookies内容缺失,以及解决措施。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

无头模式(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都一样。')

运行结果截图:

Selenium webdriver的无头模式(headless)可能导致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使用了。文章来源地址https://www.toymoban.com/news/detail-401899.html

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)

到了这里,关于Selenium webdriver的无头模式(headless)可能导致cookies内容缺失,以及解决措施的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux centos安装google chrome浏览器使用headless无头模式 制作docker镜像

    chromedriver 驱动下载地址: https://npm.taobao.org/mirrors/chromedriver/ linux centos安装google chrome浏览器使用headless无头模式 用java开发爬虫,或者需要java操作控制浏览器来渲染页面,抓取页面元素,都需要在linux安装google chrome浏览器,然后就可以通过chrome driver来连接操作chrome浏览器了,

    2024年02月09日
    浏览(75)
  • selenium 无头模式截屏

    原文链接: selenium 无头模式截屏 上一篇: wecode 生日贺卡 flask 服务端 下一篇: wecode 图片查看组件 截取百度首页,保存为图片 砸死ubuntu环境中,可能会出现中文乱码问题,目前没有得到解决。。。。

    2023年04月09日
    浏览(48)
  • selenium无头模式

    Selenium可以在无头模式下运行,即在后台执行自动化测试任务,不需要打开浏览器窗口。无头模式可以提高测试效率,减少资源消耗,适合在服务器上运行自动化测试任务。以下是在Selenium中使用无头模式的方法: 1. 安装Headless Chrome或Firefox 无头模式需要使用Headless Chrome或Fi

    2024年02月08日
    浏览(48)
  • Selenium chrome headless模式下加载扩展的问题

    Selenium headless是比较常用的自动化测试手段,但是在很长一段时间无法加载扩展。本文将介绍Selenium chrome如何加载扩展以及headless模式下加载扩展的问题及解决方式。 推荐使用第三种方式。 另外chrome安装的插件在C:Users(username)AppDataLocalGoogleChromeUser DataDefaultExtensions 下可找

    2024年02月13日
    浏览(76)
  • Python Headless Chrome(无头谷歌浏览器)

    在我们使用Selenium驱动ChromeDriver时,可以弹出谷歌浏览器,模拟人为操作谷歌浏览器,这就是自动化测试。虽然很厉害,但是也有一个很现实的问题,因为是要真实加载完整网页,导致效率低。在自动化测试时,我们其实只需要知道是测试完成还是未完成,至于能否看到完整

    2024年02月05日
    浏览(61)
  • k8s 中的无头服务 (Headless Services)

            有时候我们不需要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 \\\"None\\\" 来创建无头服务。通过无头服务的标签选择器(Label Selector)可以将后端的 Pod 列表返回给调用的客户端。         对于无头服务,不会为其分

    2024年02月15日
    浏览(43)
  • 无头模式下selenium实现长截图(Java版本)

    无头模式下使用selenium截图时经常遇到有滚动条的界面内容截不全的问题,通过各种渠道找到了解决方案,现记录如下

    2024年02月12日
    浏览(57)
  • 【Chrome】使用k8s、docker部署无头浏览器Headless,Java调用示例

    无头浏览器是一种没有图形用户界面的浏览器。无头浏览器不通过其图形用户界面( GUI )控制浏览器的操作,而是使用命令行。 Chrome Headless 用于抓取(谷歌)、测试(开发者)和黑客(黑客)。 搜索引擎,使用它来呈现页面、生成动态内容和索引来自单页 Web 应用程序的数据。 SEO 工

    2024年02月08日
    浏览(45)
  • Python selenium无界面headless

    视频版教程:一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium Chrome-headless 模式, Google 针对 Chrome 浏览器 59版 新增加的一种模式,可以让你不打开UI界面的情况下使用 Chrome 浏览器,所以运行效果与 Chrome 保持完美一致,因此速度快与要打开界面的selenium,其使用

    2024年02月05日
    浏览(38)
  • selenium无头浏览器

    无头浏览器,也是通过selenium操作浏览器,但是浏览器不弹出来的意思 需要用到这个:

    2024年02月11日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包