https://github.com/ultrafunkamsterdam/undetected-chromedriver
Patch Selenium Chromedriver optimisé qui ne déclenche pas les services anti-bot comme Distill Network / Imperva / DataDome / Botprotect.io Télécharge automatiquement le binaire du pilote et le corrige.
pip install undetected-chromedriver
ou, si vous vous sentez aventureux, installez directement via github
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
Je mettrai des limites au suivi des problèmes. On en abuse depuis trop longtemps.
une bonne nouvelle ?
Oui, j'ai ouvert des discussions non détectées qui, je pense, nous aideront mieux à long terme.
CE PAQUET NE LE FAIT PAS, et je le répète, NE cache PAS votre adresse IP, donc lorsque vous exécutez à partir d'un centre de données (même les plus petits), il y a de grandes chances que vous ne passiez pas ! De plus, si votre réputation IP chez vous est faible, vous ne réussirez pas !
Exécuter le code suivant depuis chez vous et depuis un centre de données.
import undetected_chromedriver as uc
driver = uc . Chrome ( headless = True , use_subprocess = False )
driver . get ( 'https://nowsecure.nl' )
driver . save_screenshot ( 'nowsecure.png' )
Grosse mise à jour ! soyez prudent car cela pourrait -potentiellement- casser votre code.
réécrit le mécanisme anti-détection au lieu de supprimer et de renommer les variables, nous les conservons simplement, mais empêchons leur injection en premier lieu. Cela nous protégera de la détection, au moins dans un avenir proche.
réécrit le nom du fichier, pour éviter de se retrouver avec 1000 de {randomstring}_chromedriver.exe à la place, il s'appelle simplement undetected_chromedriver.exe
le nettoyage a supprimé les fichiers compat, v2 et le dossier tests
ajout de la méthode WebElement.click_safe(), que vous pouvez essayer au cas où vous seriez détecté après avoir cliqué sur un lien. Il n’est pas garanti que cela fonctionne.
ajout de WebElement.children(self, tag=None, recursive=False) pour obtenir/trouver facilement des nœuds enfants. exemple:
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))
ajout d'un fichier example.py vers lequel je peux pointer les gens lorsqu'ils posent des questions idiotes (non, c'est en fait plutôt cool, tout le monde devrait le voir)
ajout du support pour la plateforme lambda
ajout du support pour x86_32
ajout de la prise en charge des rapports système sous Linux2
quelques refactorisations
use_subprocess est désormais défini par défaut sur True. trop de gens ne comprennent pas le multitraitement et name == ' main , et après tests, cela ne semble plus faire de différence dans Chrome 104+
ajout de no_sandbox, qui est par défaut True, et ce sans la barre ennuyeuse "vous utilisez une ligne de commande non sécurisée ...".
mettre à jour l'image Docker. vous pouvez maintenant vnc ou rdp dans votre conteneur pour voir la fenêtre réelle du navigateur
bien sûr, le mode "normal" fonctionne aussi
cette version might
casser votre code, testez avant la mise à jour !
ajout d'une nouvelle logique anti-détection !
La v2 est devenue le module principal, donc plus besoin de références à la v2. cela signifie que vous pouvez maintenant simplement utiliser :
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' )
pour des raisons de compatibilité ascendante, la v2 n'est pas supprimée, mais un alias vers le module principal.
Correction de "l'écran de bienvenue" persistant sur les systèmes d'exploitation non Windows. Pour les fétichistes qui ❤ accueillent les écrans et alimentent Google avec encore plus de données, utilisez Chrome(suppress_welcome=False).
remplacé executable_path
dans le constructeur en faveur de browser_executable_path
qui ne doit pas être utilisé sauf si vous êtes le cas extrême (oui, vous l'êtes) qui ne peut pas ajouter votre dossier d'installation Chrome personnalisé à votre variable d'environnement PATH, ou avoir une armée de navigateurs/versions différents et la recherche automatique renvoie le mauvais navigateur
"v1" (?) déplacé vers _compat pour l'instant.
versions à dépendances fixes
Gestion personnalisée de ChromeOptions supprimée, elle est donc compatible avec webdriver.chromium.options.ChromiumOptions
.
supprimé Chrome.get() fu et restauré à "presque" l'original :
with
les déclarations ne sont plus nécessaires, même si cela fonctionnera toujours pour des raisons de compatibilité ascendante.réussite des tests à ce jour : 100 %
juste pour en parler une autre fois, car certaines personnes ont du mal à lire : le headless est toujours en WIP. Soulever des problèmes est inutile
changer le comportement de création de processus pour être complètement détaché
modification de la méthode .get(url) pour toujours utiliser le gestionnaire de contexte
modification de la méthode .get(url) pour utiliser cdp sous le capot.
... l'instruction with
n'est plus nécessaire ..
todo : travailler vers l'asyncification et le sélénium 4
Chaque fois que vous rencontrez des intimidés
from session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
la solution est simple :
import undetected_chromedriver as uc
driver = uc . Chrome ( version_main = 95 )
Juillet 2021 : actuellement occupé à implémenter Selenium 4 pour un pilote Chrome non détecté
flash info : #255
Pour éviter de vous arracher les cheveux et de soulever des problèmes inutiles, veuillez tenir compte de la note importante à la fin de ce document.
Littéralement, c'est tout ce que vous avez à faire. Les paramètres sont inclus et l'exécutable de votre navigateur est trouvé automatiquement. C'est également l'extrait que je recommande d'utiliser au cas où vous rencontreriez un problème.
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
Littéralement, c'est tout ce que vous avez à faire. Si un dossier spécifié n'existe pas, un NOUVEAU profil est créé. Les répertoires de données spécifiés ainsi ne seront pas automatiquement supprimés à la sortie.
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
Littéralement, c'est tout ce que vous avez à faire. Vous pouvez maintenant écouter et vous abonner au protocole devtools de bas niveau. J'ai récemment découvert que nous prévoyions également une future version du pilote Chrome officiel. Cependant, j'ai implémenté le mien pour l'instant. Puisque j'en avais moi-même besoin pour enquêter.