Selenium无头模式容易遇到的坑

 在无头模式下,我们看不到浏览器的操作,但是selenium无头模式的浏览器向服务器发送的请求头和正常模式下还是有点区别的,这就导致了一些网站会检测到我们是用selenium来访问的,从而导致一些问题

  下面就是我在使用selenium无头模式时遇到的一些问题,以及解决方案

  1.user-agent过短

  selenium默认的user-agent比较短,这就可能会让部分网站检测出我们使用了selenium,增加了这一特征点被检测出来的概率。我们可以修改user-agent来解决这个问题

  在selenium的options中添加如下代码即可:

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

2.设置浏览器分辨率

selenium无头模式下的浏览器分辨率默认是800*600,这个分辨率太小了,很容易被检测出来,我们可以设置一个大一点的分辨率来解决这个问题

option = webdriver.ChromeOptions()
  option.add_argument('--headless')
  options.add_argument("--window-size=1920,1080")
  browser = webdriver.Chrome(chrome_options=option)
  browser.set_window_size(1920, 1080)

3.禁用GPU加速

  selenium无头模式下的浏览器默认是开启GPU加速的,我们可以禁用GPU加速来解决这个问题,GPU加速会让浏览器的性能更好,但是会增加一些特征点,从而被检测出来

#谷歌文档提到需要加上这个属性来规避bug
  chrome_options.add_argument("--disable-gpu")

4.js检测webdriver

  有些网站会通过js来检测是否使用了selenium,在启用selenium后js读取window.navigator.webdriver参数返回值为true,这样就可以检测出我们使用了selenium

  反检测代码如下:

 option.add_argument('--headless')
  # 关闭浏览器上部提示语:Chrome正在受到自动软件的控制(改修js特征)
  options.add_experimental_option('excludeSwitches', ['enable-automation'])
  options.add_experimental_option('useAutomationExtension', False)
  browser = webdriver.Chrome(chrome_options=option)
  browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      })
    """
  })

最终代码

 from selenium import webdriver
  from selenium.webdriver.chrome.options import Options
  option = webdriver.ChromeOptions()
  option.add_argument('--headless')
  # 关闭浏览器上部提示语:Chrome正在受到自动软件的控制
  options.add_experimental_option('excludeSwitches', ['enable-automation'])
  options.add_experimental_option('useAutomationExtension', False)
  option.add_argument("--window-size=1920,1080") # 设置浏览器分辨率(窗口大小)
  option.add_argument("--disable-gpu") # 禁用GPU加速
  options.add_argument("blink-settings=imagesEnabled=false") # 不加载图片, 提升速度
  options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
  option.add_argument('--hide-scrollbars')  # 隐藏滚动条, 应对一些特殊页面
  # 设置user-agent
  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}')
  browser = webdriver.Chrome(chrome_options=option)
  browser.set_window_size(1920, 1080)
  # 关闭浏览器上部提示语:Chrome正在受到自动软件的控制
  browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
      Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
      })
    """
  })

使用以上代码初始化selenium后,应该可以规避挺大一部分网站对爬虫的检测了,但是也不是万能的,有些网站可能还是会检测出来,这时候就需要我们自己去分析网站的检测方式,然后针对性的去解决了

希望各位能遵守爬虫规则,不要去爬取一些不应该爬取的网站,多多遵守robots协议,不要给爬虫带来不好的影响。

 感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统设计之数据库

为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例,很快就会导致决策疲劳。 我们希望这份备忘单提供高级指导,以找到符合您项目需求的正确服务并避免潜在的陷阱。 注意:Google 关于其数据库用例的文档有限。尽管…

【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)三种strlen模拟实现

🌈write in front :🔍个人主页 : 啊森要自信的主页 ✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&am…

C++: 多态

多态的基本概念: 多态是 C 面向对象三大特性之一 多态分为两类: 静态多态 : 函数重载 和 运算符重载属于静态多态,复用函数名 动态多态 : 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定 …

学习IO的第三天

作业1 使用文件IO完成对图像的读写操作 #include <head.h>int main(int argc, const char *argv[]) {int fd -1;if((fdopen(argv[1],O_RDONLY)) -1){perror("open error");return -1;}int wd -1;if((wdopen(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664)) -1){…

<蓝桥杯软件赛>零基础备赛20周--第9周--前缀和与差分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

智能优化算法应用:基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鹈鹕算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

【Linux】进程见通信之匿名管道pipe

1.匿名管道的特点 以下管道的统称仅代表匿名管道。 管道是一个只能单向通信的通信信道。为了实现进程间通信.管道是面向字节流的。仅限于父子通信或者具有血缘关系的进程进行进程见通信。管道自带同步机制&#xff0c;原子性写入。管道的生命周期是随进程的。 2.匿名管道通信…

Spring 向页面传值以及接受页面传过来的参数的方式

一、从页面接收参数 Spring MVC接收请求提交的参数值的几种方法&#xff1a; 使用HttpServletRequest获取。 RequestMapping("/login.do") public String login(HttpServletRequest request){ String name request.getParameter("name") String pa…

SpringCloud简介和用处

Spring Cloud是一套基于Spring Boot的微服务框架&#xff0c;它旨在提供一种快速构建分布式系统的方法。它可以帮助开发人员构建具有高可用性、可扩展性和容错性的微服务&#xff0c;并通过Spring Boot的开发工具和库提供强大的支持。 一、简介 Spring Cloud是Spring家族中的一…

ABB YuMi协作式双臂机器人进入工厂,极大缓解劳动力短缺问题

原创 | 文 BFT机器人 日本SUS公司是一家为汽车和其他制造业提供铝框架和压铸铝部件的知名供应商&#xff0c;近年来&#xff0c;由于全球供应链面临严重中断&#xff0c;该公司希望能够寻找一家自动化供应商来帮助其恢复日本静冈县的产品生产。SUS公司表示&#xff0c;由于生产…

从遍历到A星寻路算法

在游戏当中&#xff0c;经常需要找一个点到其它点的路径。在之前的一篇博文(地图编辑器开发&#xff08;三&#xff09;)中也有使用到到A*寻路算法。我们期望能找到最短的路径&#xff0c;同时也需要考虑到查找路径的时间消耗。游戏中的地图可以图的数据结构来表示&#xff0c;…

关于优雅的使用SQL多行转多列的记录(doris)

文章目录 应用需求场景记录过程1. 准备数据2. 给数据根据姓名分组&#xff0c;加上序号.3. 根据name分组成map结构4. 拆分map 应用需求场景 准备的数据是这样的&#xff1a; 需要将每个人的成绩显示在一行上&#xff0c;需要的结果如下&#xff0c;但是我的情况是课程有非常…

代码随想录二刷 | 栈与队列 | 前 k 个高频元素

代码随想录二刷 &#xff5c; 栈与队列 &#xff5c; 前 k 个高频元素 题目描述解题思路 & 代码实现 题目描述 347.前k个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nu…

数据库:JDBC编程

专栏目录 MySQL基本操作-CSDN博客 MySQL基本操作-CSDN博客 数据库的增删查改&#xff08;CRUD&#xff09;基础版-CSDN博客 数据库增删改查&#xff08;CRUD&#xff09;进阶版-CSDN博客 数据库的索引-CSDN博客 基本概念 JDBC编程就是通过Java代码来操作数据库 api 数据库是…

【广州华锐互动】风电场检修VR情景模拟提供接近真实的实操体验

风电场检修VR情景模拟系统由广州华锐互动开发&#xff0c;这是一种新兴的培训方式&#xff0c;它通过虚拟现实技术将风力发电场全范围进行1:1仿真建模还原&#xff0c;模拟监视风力发电场各种运行工况下的运行参数和指标&#xff0c;同时可进行升压站系统的巡视&#xff0c;倒闸…

C# 使用FluentScheduler触发定时任务

写在前面 FluentScheduler是.Net平台下的一个自动任务调度组件&#xff0c;以前经常用的是Quarz.Net&#xff0c;相对而言FluentScheduler的定时配置更为直观&#xff0c;可直接用接口进行参数化设置&#xff0c;对Cron表达式有恐惧症的人来说简直就是福音&#xff0c;使用起来…

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

简介&#xff1a; 首先我们需要知道TCP传输和UDP传输的区别&#xff0c;UDP相当于只管发送不管对方是否接收到了&#xff0c;而TCP相当于打电话&#xff0c;需要进行3次握手&#xff0c;4次挥手&#xff0c;所以我们就需要在应用层上做一些功能添加&#xff0c;如&#xff1a;…

Spring基于注解存储对象

小王学习录 前言基于注解存储对象Controller (控制器存储)Service (服务存储)Repository (仓库存储)Component (组件存储)Configuration (配置存储)Bean(方法注解) 前言 上一篇文章中已经介绍了在Spring中存储Bean和取Bean的方法. 而在 Spring 中想要更简单的存储和读取对象的…

让工作更高效,那些不能错过的8款泳道图绘制工具

在现代企业的运营管理中&#xff0c;泳道图扮演了至关重要的角色。这种独特的图表工具以其直观、清晰的特点&#xff0c;帮助我们理解和改进复杂的工作流程&#xff0c;从而提升效率。本文将为你分享8款实用且高效的泳道图绘制工具&#xff0c;它们能够帮助你轻松创建出专业级别…

Emscripten运行时

本章将简要介绍Emscripten环境下与运行时相关的部分知识&#xff0c;包括消息循环、文件系统、内存管理等内容。 main函数与生命周期 生成本地代码时&#xff0c;作为C/C程序的入口函数&#xff0c;通常main()函数意味着程序的整个生命周期&#xff0c;程序随main()函数返回的…