https://github.com/ultrafunkamsterdam/undetected-chromedriver
Parche optimizado de Selenium Chromedriver que no activa servicios anti-bot como Distill Network / Imperva / DataDome / Botprotect.io Descarga automáticamente el binario del controlador y lo parchea.
pip install undetected-chromedriver
o, si te sientes aventurero, instálalo directamente a través de github
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
Pondré límites al rastreador de problemas. Se ha abusado de él durante demasiado tiempo.
alguna buena noticia?
Sí, abrí Discusiones no detectadas que creo que nos ayudarán mejor a largo plazo.
ESTE PAQUETE NO, y repito, NO oculta su dirección IP, por lo que cuando se ejecuta desde un centro de datos (incluso los más pequeños), ¡hay muchas posibilidades de que no pase! Además, si tu reputación de IP en casa es baja, ¡no aprobarás!
Ejecutando el siguiente código desde casa y desde un centro de datos.
import undetected_chromedriver as uc
driver = uc . Chrome ( headless = True , use_subprocess = False )
driver . get ( 'https://nowsecure.nl' )
driver . save_screenshot ( 'nowsecure.png' )
¡Gran actualización! tenga cuidado ya que -potencialmente- podría romper su código.
Reescribimos el mecanismo anti-detección en lugar de eliminar y cambiar el nombre de las variables, simplemente las mantenemos, pero evitamos que se inyecten en primer lugar. Esto nos mantendrá a salvo de la detección al menos en el futuro cercano.
Se reescribió el nombre del archivo para evitar terminar con 1000 de {randomstring}_chromedriver.exe. En su lugar, simplemente se llama undetected_chromedriver.exe.
limpieza eliminó compatibilidad, archivos v2 y carpeta de pruebas
Se agregó el método WebElement.click_safe(), que puede probar en caso de que lo detecten después de hacer clic en un enlace. No se garantiza que esto funcione.
Se agregó WebElement.children(self, tag=None, recursive=False) para obtener/encontrar fácilmente nodos secundarios. ejemplo:
body = driver.find_element('tag name', 'body')
# get the 6th child (any tag) of body, and grab all img's within (recursive).
images = body.children()[6].children('img', True)
srcs = list(map(lambda _:_.attrs.get('src'), images))
Agregué example.py donde puedo señalar a las personas cuando hacen preguntas tontas (no, en realidad es bastante bueno, todos deberían verlo)
soporte agregado para la plataforma lambda
soporte agregado para x86_32
Se agregó soporte para sistemas que informan como Linux2.
algo de refactorización
use_subprocess ahora tiene el valor predeterminado True. demasiadas personas no entienden el multiprocesamiento y name == ' main , y después de las pruebas, parece que ya no hace ninguna diferencia en Chrome 104+
Se agregó no_sandbox, cuyo valor predeterminado es True, y esto sin la molesta barra "estás usando una línea de comando no segura ...".
actualizar la imagen de Docker. ahora puede ingresar vnc o rdp a su contenedor para ver la ventana real del navegador
Por supuesto, el modo "normal" también funciona.
Esta versión might
romper su código, ¡pruébelo antes de actualizar!
¡Se agregó nueva lógica anti-detección!
v2 se ha convertido en el módulo principal, por lo que ya no es necesario hacer referencias a v2. esto significa que ahora puedes simplemente usar:
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' )
Para compatibilidad con versiones anteriores, la versión 2 no se elimina, sino que se le asigna un alias al módulo principal.
Se corrigió la molestia de la "pantalla de bienvenida" en sistemas operativos que no son Windows. Para aquellos nagfetichistas que dan la bienvenida a las pantallas y alimentan a Google con aún más datos, utilice Chrome (suppress_welcome=False).
reemplazó executable_path
en el constructor a favor de browser_executable_path
, que no debe usarse a menos que sea el caso extremo (sí, lo es) que no puede agregar su carpeta de instalación personalizada de Chrome a su variable de entorno PATH, o tiene un ejército de diferentes navegadores/versiones. y la búsqueda automática devuelve el navegador incorrecto
"v1" (?) se movió a _compat por ahora.
versiones de dependencia fija
Se eliminó el manejo personalizado de ChromeOptions, por lo que es compatible con webdriver.chromium.options.ChromiumOptions
.
eliminó Chrome.get() fu y lo restauró a "casi" el original:
with
no se necesitan declaraciones, aunque seguirá funcionando por razones de compatibilidad con versiones anteriores.éxito de la prueba hasta la fecha: 100%
Solo para mencionarlo en otra ocasión, ya que a algunas personas les cuesta leer: headless sigue siendo WIP. Plantear problemas es innecesario
cambiar el comportamiento de creación del proceso para que esté completamente separado
Se cambió el método .get(url) para usar siempre el administrador de contexto.
Se cambió el método .get(url) para usar cdp bajo el capó.
... la declaración with
ya no es necesaria ...
tarea pendiente: trabajar hacia la asincronización y el selenio 4
Siempre que te encuentres con los intimidados
from session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
la solución es sencilla:
import undetected_chromedriver as uc
driver = uc . Chrome ( version_main = 95 )
Julio de 2021: actualmente ocupado implementando Selenium 4 para Chromedriver no detectado
noticia de última hora: #255
Para evitar tirones de pelo innecesarios y problemas, tenga en cuenta la nota importante al final de este documento.
Literalmente, esto es todo lo que tienes que hacer. Las configuraciones están incluidas y el ejecutable de su navegador se encuentra automáticamente. Este es también el fragmento que recomiendo usar en caso de que experimentes algún problema.
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
Literalmente, esto es todo lo que tienes que hacer. Si una carpeta especificada no existe, se crea un NUEVO perfil. Los directorios de datos que se especifican de esta manera no se eliminarán automáticamente al salir.
import undetected_chromedriver as uc
options = uc . ChromeOptions ()
# setting profile
options . user_data_dir = "c: \ temp \ profile"
# use specific (older) version
driver = uc . Chrome (
options = options , version_main = 94
) # version_main allows to specify your chrome version instead of following chrome global version
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
Literalmente, esto es todo lo que tienes que hacer. Ahora puede escuchar y suscribirse al protocolo devtools de bajo nivel. Recientemente descubrí que también se está planificando el lanzamiento futuro del controlador Chromedriver oficial. Sin embargo, implementé el mío propio por ahora. Ya que lo necesitaba yo mismo para la investigación.