如何避免Selenium webdriver被识别为机器人,解决触发验证码问题
Selenium Chrome驱动访问网站触发验证码的解决方法
目标网站通过检测浏览器自动化特征识别Selenium,你当前配置的启动参数只覆盖了部分特征,还有其他指纹信息被反爬系统识别,修改$cdc_变量的方法只对旧版本Chrome有效,新版本Chrome已经新增了更多检测维度,可按以下方案调整:
- 注入JS覆盖自动化特征
在调用driver.get之前添加如下代码,在页面加载前修改浏览器指纹属性:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) window.chrome = { runtime: {} } Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3] }) Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN', 'zh', 'en'] }) delete navigator.__proto__.webdriver """ })
- 优化启动参数
你当前配置的参数存在冗余和冲突项,建议调整:删掉--single-process(易导致浏览器不稳定暴露特征)、重复的--disable-blink-features=AutomationControlled和--start-fullscreen参数,调整后配置如下:
from selenium.webdriver.chrome.options import Options import time from selenium import webdriver options = Options() options.add_argument('--no-sandbox') options.add_argument('--start-maximized') options.add_argument('--disable-dev-shm-usage') options.add_argument("--incognito") options.add_argument('--disable-blink-features=AutomationControlled') options.add_experimental_option('useAutomationExtension', False) options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_argument("disable-infobars") driver = webdriver.Chrome(executable_path="chromedriver.exe", options=options) # 此处添加上面的注入JS代码 driver.get("https://muckrack.com/media-outlets") time.sleep(20)
- 加载本地Chrome用户配置
直接调用你日常使用的Chrome的用户数据,让Selenium启动的浏览器指纹和你手动打开的浏览器完全一致,规避特征检测:
# 替换路径为你本地Chrome的用户数据目录,默认路径为C:\Users\你的系统用户名\AppData\Local\Google\Chrome\User Data options.add_argument(r"--user-data-dir=C:\Users\XXX\AppData\Local\Google\Chrome\User Data") options.add_argument(r"--profile-directory=Default")
注意使用该参数前需要关闭所有已经打开的Chrome窗口,否则会启动失败。
- 使用undetected-chromedriver
该库专门修改了chromedriver的底层特征,能绕过绝大多数自动化检测,安装后直接替换原生Selenium的驱动即可:
安装命令:pip install undetected-chromedriver
使用示例:
import undetected_chromedriver as uc import time driver = uc.Chrome() driver.get("https://muckrack.com/media-outlets") time.sleep(20)
内容的提问来源于stack exchange,提问作者NoobDev
相关产品推荐
相关产品推荐

