在无头模式下,我们看不到浏览器的操作,但是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协议,不要给爬虫带来不好的影响。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取