
Sucessor do Undetected-Chromedriver. Oferecendo uma estrutura extremamente rápida para automação web, web scraping, bots e quaisquer outras ideias criativas que normalmente são dificultadas por sistemas irritantes de anti-bot como Captcha / CloudFlare / Imperva / hCaptcha.
A comunicação direta oferece resistência ainda melhor contra firewalls de aplicações web (WAF’s), enquanto o desempenho ganha um enorme impulso. Este módulo, ao contrário do undetected-chromedriver, é totalmente assíncrono.
O que torna este pacote diferente de outros pacotes conhecidos é a otimização para permanecer indetectado para a maioria das soluções anti-bot.
Outro ponto de foco é a usabilidade e a prototipagem rápida, então espere que muita coisa funcione -as is-,
com a maioria dos parâmetros de métodos tendo padrões de best practice (boas práticas).
Usando 1 ou 2 linhas, ele está pronto para funcionar, fornecendo configuração de boas práticas
por padrão. Ele limpa os arquivos criados (perfil) em seguida.
conhecido por funcionar com
Embora usabilidade e conveniência sejam importantes, também é fácil personalizar totalmente tudo usando toda a gama de domínios, métodos e eventos do CDP disponíveis.
Sem dependência do binário chromedriver ou do Selenium
Funcionando com 1 linha de código*
usa um perfil novo a cada execução e limpa ao sair
salva e carrega cookies em arquivo para não repetir etapas tediosas de login
tab.find("sometext")
tab.find_all("sometext")
tab.select("a[class*=something]")
tab.select_all("a[href] > div > img")
busca de elementos inteligente e eficiente, por seletor ou texto, incluindo conteúdo de iframes.
isso também pode ser usado como condição de espera para um elemento aparecer, pois tentará novamente
durante o período de <timeout> até encontrar. Portanto, um await tab.select('body') pode ser usado
como indicador de se uma página foi carregada.
o método find busca por texto, mas não retorna ingenuamente o primeiro
elemento correspondente; em vez disso, combina candidatos pela correspondência mais próxima em comprimento de texto (o mais curto vence),
isso faz com que buscas como tab.find('accept all') retornem o botão real de cookies em vez de
um script nos cabeçalhos
pode se conectar a uma sessão de depuração do chrome em execução
__repr__ descritivo para elementos, que representa o elemento como html
função utilitária para converter uma instância undetected_chromedriver.Chrome em execução em uma instância nodriver.Browser e continuar a partir daí
repleto de auxiliares e métodos utilitários para as operações mais usadas e importantes
Partes foram reescritas para usar conexões flat no protocolo.
Por quê?
- iframes são incluídos na maioria das operações.
- o objeto tab ganhou um novo método: await tab.get_frames()
que retornará Iframes inspecionáveis.
- find() incluirá iframes, para que você possa até mesmo procurar por "verify you are human" e
clicar na caixa de verificação em desafios de js.
Como isso exigiu bastante reescrita, teste minuciosamente, especialmente se você executa projetos grandes.
tab.xpath(selector, timeout=2.5)encontre nós usando o seletor xpath! veja tab xpath na documentação da API
tab.cf_verify()encontra a caixa de seleção e clica nela com sucesso isso só funciona quando NÃO está no modo expert. atualmente, apenas inglês embutido requer que o pacote opencv-python esteja instalado
tab.bypass_insecure_connection_warning()método de conveniência para o aviso de página insegura. por exemplo, quando um certificado é inválido.
tab.open_external_debugger()permite inspecionar a aba sem quebrar sua conexão
tab.get_local_storage()obtém o conteúdo do localstorage
tab.set_local_storage(dict)define o conteúdo do localstorage
tab.add_handler(someEvent, callback)o callback pode aceitar um único argumento (event) ou 2 argumentos (event, tab).
start(expert=True)faz alguns ajustes para usuários mais experientes. Desativa a segurança web e origin-trials, além de garantir que shadow-roots estejam sempre abertos. Porém, isso torna você mais detectável!
você precisa ter o chrome (ou algum navegador baseado em chromium) instalado, preferencialmente no local padrão, na máquina em que você usa este pacote.
ao executar em uma máquina headless, como AWS ou qualquer outro ambiente onde não há display, é melhor usar alguma ferramenta Xvfb para emular uma tela. alternativamente, este pacote pode ser usado no modo headless.
pip install nodriver
pip install -U nodriver
O objetivo deste projeto (assim como o undetected-chromedriver, em algum momento no passado) é manter tudo curto e simples, para que você possa abrir rapidamente um editor ou sessão interativa, digitar ou colar algumas linhas e começar.
import nodriver as uc
async def main():
browser = await uc.start()
page = await browser.get('https://www.nowsecure.nl')
... further code ...
if __name__ == '__main__':
# since asyncio.run never worked (for me)
uc.loop().run_until_complete(main())
Vou omitir o boilerplate assíncrono aqui
from nodriver import *
browser = await start(
headless=False,
user_data_dir="/path/to/existing/profile", # by specifying it, it won't be automatically cleaned up when finished
browser_executable_path="/path/to/some/other/browser",
browser_args=['--some-browser-arg=true', '--some-other-option'],
lang="en-US" # this could set iso-language-code in navigator, not recommended to change
)
tab = await browser.get('https://somewebsite.com')
Vou omitir o boilerplate assíncrono aqui
from nodriver import *
config = Config()
config.headless = False
config.user_data_dir="/path/to/existing/profile", # by specifying it, it won't be automatically cleaned up when finished
config.browser_executable_path="/path/to/some/other/browser",
config.browser_args=['--some-browser-arg=true', '--some-other-option'],
config.lang="en-US" # this could set iso-language-code in navigator, not recommended to change
)
import nodriver
async def main():
browser = await nodriver.start()
page = await browser.get('https://www.nowsecure.nl')
await page.save_screenshot()
await page.get_content()
await page.scroll_down(150)
elems = await page.select_all('*[src]')
for elem in elems:
await elem.flash()
page2 = await browser.get('https://twitter.com', new_tab=True)
page3 = await browser.get('https://github.com/ultrafunkamsterdam/nodriver', new_window=True)