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协议,不要给爬虫带来不好的影响
欢迎各位大佬指出不足,共同进步(新人一枚,写的不好的地方还请多多包涵)