Selenium无头模式容易遇到的坑

本文讲述了在使用Selenium无头模式进行网页自动化测试时遇到的问题,如用户代理过短、低分辨率、GPU加速引发的网站检测,提供了修改user-agent、设置高分辨率和禁用GPU加速等解决方法。同时提醒读者遵守爬虫规则,尊重robots协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在无头模式下,我们看不到浏览器的操作,但是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协议,不要给爬虫带来不好的影响。

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

 

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

 

当你使用Selenium无头模式(headless)下运行时,通常不会显示实际的浏览器界面,因为无头模式就是指浏览器在后台运行,不打开图形用户界面(GUI)。然而,有时候即使设置为无头模式,某些情况下还是可能出现意外地弹出浏览器窗口的情况。 这可能是因为以下原因: 1. **默认行为**: 部分浏览器或浏览器驱动可能有默认的行为,即便设置了无头模式,在遇到特定操作时仍会启动UI。 2. **错误配置**: 可能是你在初始化Selenium WebDriver时没有正确指定无头选项。确保你在创建`webdriver.Chrome()`或其他浏览器实例时添加了`options.add_argument('--headless')`。 3. **安全策略**: 有些安全策略可能会导致浏览器在处理某些请求时弹出确认对话框,这时你需要关闭这些提示。 4. **调试输出**: 如果浏览器的日志级别被设置得较高,也可能导致控制台信息以窗口形式出现。 5. **第三方扩展** 或 **插件**: 如果你之前安装过浏览器扩展,它们可能不受无头模式影响。 要解决这个问题,你可以按照以下步骤检查并调整: - 确保在初始化WebDriver时正确设置了无头模式: ```python from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') # 针对GPU加速的问题 driver = webdriver.Chrome(options=options) ``` - 检查浏览器的安全设置,如有必要,禁用不必要的弹窗确认。 - 关闭所有可能的调试日志输出。 - 禁止使用可能触发窗口弹出的任何第三方扩展或插件。 如果以上措施无效,可能需要查看具体的错误消息或查阅浏览器文档,寻找特定情况下的解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值