在使用Selenium进行网页抓取时,WebDriver会向服务器发送信息以表明请求是自动化的。
WebDriver被期望具有诸如window.navigator.webdriver之类的属性,这是W3C WebDriver规范所规定的,以便于进行更好的测试和作为一种安全功能。但是这会导致被Web服务器检测到,从而导致被标记或被拒绝访问。
随着execute_cdp_cmd(cmd, cmd_args)命令的可用性,现在可以使用Selenium轻松执行Google Chrome DevTools命令。这使得可以更改默认的标志。
代码1:
# 会显示【chrome正受到自动测试软件的控制】
from selenium import webdriver
# 创建chrome的webDriver
driver = webdriver.Chrome()
driver.get('https://bot.sannysoft.com/') # 注意该网站需FQ才能打开
显示如下:
代码2:
# 不会显示【chrome正受到自动测试软件的控制】
from selenium import webdriver
# 创建一个Chromeoptions实例
options = webdriver.ChromeOptions()
# 添加一个参数来禁用“AutomationControlled”标志
options.add_argument("--disable-blink-features=AutomationControlled")
# Exclude the collection of enable-automation switches
options.add_experimental_option("excludeSwitches", ["enable-automation"])
# 关闭 userAutomationExtension
options.add_experimental_option("useAutomationExtension", False)
# 创建chrome的webDriver
driver = webdriver.Chrome(options=options)
# 将webdriver的navigator值属性更改为undefined
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.get('https://bot.sannysoft.com/') # 注意该网站需FQ才能打开
显示如下: