selenium无头模式容易遇到的坑(防检测)

2023年 9月 30日 157.9k 0

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协议,不要给爬虫带来不好的影响

欢迎各位大佬指出不足,共同进步(新人一枚,写的不好的地方还请多多包涵)

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论