Python Selenium Headless模式下爬虫的一些反爬方法

在使用Selenium设计爬虫的过程中,其实很多时候浏览器是不用打开的,但是为了方便调试,我们往往会在本地打开浏览器,如果确实不需要打开浏览器,我们可以把浏览器设置为Headless模式,这样就可以避免打开浏览器,节省资源,但是有时候,目标网站会检测到你的爬虫,导致爬虫无法正常运行,本文就此问题介绍解决方法。

1.设置请求头 user-agent

在浏览器Chrome(下文都称呼为Chrome)中,正常情况下和Headless模式下的请求头是有差别的,所以目标网站可以很容易的根据Headless模式下的请求头来分辨出程序是否为爬虫脚本,从而阻止程序。所以,我们可以通过设置请求头来模拟浏览器,从而避免被反爬虫机制检测到。

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 设置为无头模式

2.设置分辨率

Chrome浏览器在Headless模式下,浏览器默认的分辨率是800*600,很多情况下,目标网站会检测到分辨率,从而阻止爬虫,而且,在这样的默认分辨率下,页面中很多元素会无法加载,从而导致元素无法定位的问题,所以我们可以设置分辨率,模拟真实浏览器。

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--window-size=1920,1080') # 设置分辨率
browser = webdriver.Chrome(options=options)
browser.set_window_size(1920, 1080)

3.禁用GPU加速

Headless模式下,Chrome浏览器默认会启用GPU加速,但是目标网站会检测到GPU加速,从而阻止爬虫,所以我们可以禁用GPU加速。

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu') # 禁用GPU加速

但是,在我个人的测试下,很多网站没有这个检测,或者说没有对GPU加速进行检测,所以大家可以根据具体情况决定是否禁用GPU加速。

4.杂谈

不使用Headless模式时打开浏览器,上面总会出现类似于”Chrome正在受到自动化软件的控制”的提示,这个提示是Chrome浏览器自带的,在Headless模式下,这个提示不会出现,但是目标网站会检测到这个提示,从而阻止爬虫,就算不阻止,我们看着也不爽,我们可以手动的禁止掉这个提示。

from selenium import webdriver
options = webdriver.ChromeOptions()
browser = webdriver.Chrome(options=options)
browser.set_window_size(1920, 1080)
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})

这段代码的作用是,在每次新打开一个页面时,将navigator.webdriver的值设置为undefined,从而禁止掉”Chrome正在受到自动化软件的控制”的提示。