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

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐