https://github.com/ultrafunkamsterdam/undetected-chromedriver
Patch otimizado do Selenium Chromedriver que não aciona serviços anti-bot como Distill Network / Imperva / DataDome / Botprotect.io Baixa automaticamente o binário do driver e o corrige.
pip install undetected-chromedriver
ou, se você estiver se sentindo aventureiro, instale diretamente via github
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
Estarei colocando limites no rastreador de problemas. Foi abusado por muito tempo.
alguma boa notícia?
Sim, abri Discussões não detectadas que acho que nos ajudarão melhor no longo prazo.
ESTE PACOTE NÃO, e repito, NÃO esconde seu endereço IP, portanto, ao executar a partir de um datacenter (mesmo os menores), as chances são grandes de você não passar! Além disso, se a reputação do seu IP em casa for baixa, você não passará!
Executando o seguinte código em casa e em um datacenter.
import undetected_chromedriver as uc
driver = uc . Chrome ( headless = True , use_subprocess = False )
driver . get ( 'https://nowsecure.nl' )
driver . save_screenshot ( 'nowsecure.png' )
Grande atualização! tenha cuidado, pois isso pode quebrar seu código.
reescrevemos o mecanismo anti-detecção em vez de remover e renomear variáveis, apenas as mantemos, mas evitamos que sejam injetadas em primeiro lugar. Isso nos manterá protegidos contra detecção, pelo menos no futuro próximo.
reescreveu o nome do arquivo, para evitar acabar com 1000 de {randomstring}_chromedriver.exe em vez disso, é chamado apenas de undetected_chromedriver.exe
limpeza removida compatibilidade, arquivos v2 e pasta de testes
adicionado o método WebElement.click_safe(), que você pode tentar caso seja detectado após clicar em um link. Não é garantido que isso funcione.
adicionado WebElement.children(self, tag=None, recursive=False) para obter/encontrar facilmente nós filhos. exemplo:
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))
adicionado example.py onde posso apontar as pessoas ao fazer perguntas bobas (não, na verdade é muito legal, todos deveriam ver)
adicionado suporte para plataforma lambda
adicionado suporte para x86_32
adicionado suporte para relatórios de sistemas como linux2
alguma refatoração
use_subprocess agora tem como padrão True. muitas pessoas não entendem multiprocessamento e name == ' main , e após o teste, parece não fazer mais diferença no Chrome 104+
adicionado no_sandbox, cujo padrão é True, e isso sem a irritante barra "você está usando uma linha de comando insegura ...".
atualizar a imagem do Docker. agora você pode vnc ou rdp em seu contêiner para ver a janela real do navegador
claro, o modo "normal" também funciona
esta versão might
quebrar seu código, teste antes de atualizar!
adicionada nova lógica anti-detecção!
v2 se tornou o módulo principal, portanto não há mais necessidade de referências a v2. isso significa que agora você pode simplesmente usar:
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' )
para compatibilidade com versões anteriores, v2 não é removido, mas tem um alias para o módulo principal.
Corrigido o problema da "tela de boas-vindas" em sistemas operacionais não Windows. Para aqueles nagfetichistas que dão as boas-vindas às telas e alimentam o Google com ainda mais dados, use o Chrome(suppress_welcome=False).
substituiu executable_path
no construtor em favor de browser_executable_path
que não deve ser usado a menos que você seja o caso extremo (sim, você é) que não pode adicionar sua pasta de instalação personalizada do Chrome à sua variável de ambiente PATH ou tem um exército de diferentes navegadores/versões e a pesquisa automática retorna o navegador errado
"v1" (?) movido para _compat por enquanto.
versões de dependência fixa
O tratamento personalizado de ChromeOptions foi removido, portanto é compatível com webdriver.chromium.options.ChromiumOptions
.
removeu Chrome.get() fu e restaurou "quase" original:
with
declarações necessárias, embora ainda funcione por uma questão de compatibilidade com versões anteriores.sucesso do teste até o momento: 100%
só para mencionar isso em outra hora, já que algumas pessoas têm dificuldade de ler: headless ainda é WIP. Levantar questões é desnecessário
alterar o comportamento de criação do processo para ser totalmente desanexado
mudou o método .get(url) para sempre usar o contextmanager
mudou o método .get(url) para usar o cdp nos bastidores.
... a instrução with
não é mais necessária.
todo: trabalhar em direção à assincronização e selênio 4
Sempre que você encontrar o assustado
from session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
a solução é simples:
import undetected_chromedriver as uc
driver = uc . Chrome ( version_main = 95 )
Julho de 2021: Atualmente ocupado implementando Selenium 4 para undetected-chromedriver
notícia: #255
Para evitar puxões de cabelo e levantamentos de questões desnecessários, lembre-se da nota importante no final deste documento.
Literalmente, isso é tudo que você precisa fazer. As configurações estão incluídas e o executável do seu navegador é encontrado automaticamente. Este também é o snippet que recomendo usar caso você tenha algum 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, isso é tudo que você precisa fazer. Se uma pasta especificada não existir, um NOVO perfil será criado. Os diretórios de dados especificados desta forma não serão removidos automaticamente na saída.
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, isso é tudo que você precisa fazer. Agora você pode ouvir e assinar o protocolo devtools de baixo nível. Recentemente descobri que também estou planejando o lançamento futuro do chromedriver oficial. No entanto, eu implementei o meu por enquanto. Já que eu mesmo precisava disso para investigação.