Selenium无头模式容易遇到的坑

发表于:2023-12-07 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:sjbsjb233    来源:稀土掘金

  在无头模式下,我们看不到浏览器的操作,但是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协议,不要给爬虫带来不好的影响。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号