Este dilema se puede tratar de diversas formas, pero en este caso te enseñamos la respuesta más completa en nuestra opinión.
Primero la actualización 1
execute_cdp_cmd()
: Con la disponibilidad de execute_cdp_cmd(cmd, cmd_args)
comando ahora puede ejecutar fácilmente los comandos google-chrome-devtools usando Selenium. Con esta función puede modificar el navigator.webdriver
fácilmente para evitar que se detecte el selenio.
Prevención de la detección 2
Para prevenir el selenio impulsado WebDriver ser detectado un enfoque de nicho incluiría uno o todos los pasos mencionados a continuación:
-
Rotar el usuario-agente a través
execute_cdp_cmd()
comando de la siguiente manera:#Setting up Chrome/83.0.4103.53 as useragent driver.execute_cdp_cmd('Network.setUserAgentOverride', "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36')
-
Cambiar el propiedad valor de la
navigator
por webdriver a indefinidodriver.execute_script("Object.defineProperty(navigator, 'webdriver', get: () => undefined)")
-
Excluir la colección de
enable-automation
interruptoresoptions.add_experimental_option("excludeSwitches", ["enable-automation"])
-
Apagar
useAutomationExtension
options.add_experimental_option('useAutomationExtension', False)
Código de muestra 3
Aprovechar todos los pasos mencionados anteriormente y el bloque de código efectivo será:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:WebDriverschromedriver.exe')
driver.execute_script("Object.defineProperty(navigator, 'webdriver', get: () => undefined)")
driver.execute_cdp_cmd('Network.setUserAgentOverride', "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36')
print(driver.execute_script("return navigator.userAgent;"))
driver.get('https://www.httpbin.org/headers')
Historia
Según el Borrador del editor del W3C la implementación actual menciona estrictamente:
El
webdriver-active
bandera se establece entrue
cuando el agente de usuario está debajo control remoto que inicialmente se establece enfalse
.
Más,
Navigator includes NavigatorAutomationInformation;
Cabe señalar que:
El
NavigatorAutomationInformation
interfaz no debe exponerse en TrabajadorNavigator.
El NavigatorAutomationInformation
interfaz Se define como:
interface mixin NavigatorAutomationInformation
readonly attribute boolean webdriver;
;
que regresa true
Si webdriver-active
bandera Está establecido, false de lo contrario.
Finalmente, el navigator.webdriver
define una forma estándar para que los agentes de usuario cooperantes informen al documento que está controlado por WebDriver, de modo que se puedan activar rutas de código alternativas durante la automatización.
Precaución: La alteración / ajuste de los parámetros mencionados anteriormente puede bloquear la navegación y consigue el WebDriver instancia detectada.
Actualización (6-nov-2019)
A partir de la implementación actual, una forma ideal de acceder a una página web sin ser detectado sería utilizar el ChromeOptions()
class para agregar un par de argumentos a:
- Excluir la colección de
enable-automation
interruptores - Apagar
useAutomationExtension
a través de una instancia de ChromeOptions
como sigue:
-
Ejemplo de Java:
System.setProperty("webdriver.chrome.driver", "C:\Utility\BrowserDrivers\chromedriver.exe"); ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation")); options.setExperimentalOption("useAutomationExtension", false); WebDriver driver = new ChromeDriver(options); driver.get("https://www.google.com/");
-
Ejemplo de Python
from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options, executable_path=r'C:pathtochromedriver.exe') driver.get("https://www.google.com/")
Leyendas
1: Se aplica solo a los clientes Python de Selenium.
2: Se aplica solo a los clientes Python de Selenium.
3: Se aplica solo a los clientes Python de Selenium.
ChromeDriver:
¡Finalmente descubrí la solución simple para esto con una simple bandera! 🙂
--disable-blink-features=AutomationControlled
navigator.webdriver =true ya no aparecerá con esa bandera configurada.
Para obtener una lista de las cosas que puede deshabilitar, véalas aquí.
No use el comando cdp para cambiar el valor de webdriver, ya que provocará inconsistencias que luego se pueden usar para detectar webdriver. Utilice el siguiente código, esto eliminará cualquier rastro de webdriver.
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")