
Sucesor de Undetected-Chromedriver. Proporciona un framework ultrarrápido para automatización web, web scraping, bots y cualquier otra idea creativa que normalmente se ve obstaculizada por molestos sistemas anti-bots como Captcha / CloudFlare / Imperva / hCaptcha.
La comunicación directa proporciona una resistencia aún mejor contra los cortafuegos de aplicaciones web (WAF), mientras que el rendimiento recibe un enorme impulso. Este módulo es, a diferencia de undetected-chromedriver, completamente asíncrono.
Lo que hace diferente a este paquete de otros paquetes conocidos es la optimización para pasar desapercibido ante la mayoría de las soluciones anti-bot.
Otro punto clave es la usabilidad y la creación rápida de prototipos, así que espera que muchas cosas funcionen -tal cual-, con la mayoría de los parámetros de métodos con valores predeterminados de mejores prácticas.
Con 1 o 2 líneas, esto está en funcionamiento, proporcionando una configuración de mejores prácticas por defecto. Además, limpia los archivos creados (perfil) al finalizar.
Se sabe que funciona con
Aunque la usabilidad y la conveniencia son importantes, también es fácil personalizar completamente todo usando toda la gama de dominios, métodos y eventos de CDP disponibles.
Sin dependencia del binario chromedriver ni de Selenium
En funcionamiento en 1 línea de código*
Utiliza un perfil nuevo en cada ejecución y limpia al salir
Guarda y carga cookies en un archivo para no repetir tediosos pasos de inicio de sesión
tab.find("sometext")
tab.find_all("sometext")
tab.select("a[class*=something]")
tab.select_all("a[href] > div > img")
búsqueda de elementos inteligente y eficiente, por selector o texto, incluido el contenido de iframes.
esto también se puede usar como condición de espera para que aparezca un elemento, ya que reintentará
durante la duración de hasta que lo encuentre. así que un await tab.select('body') podría usarse
como indicador de si una página está cargada.
el método find busca por texto, pero no devolverá ingenuamente el primer
elemento coincidente, sino que comparará candidatos por la longitud de texto coincidente más cercana (gana la más corta),
esto hace que búsquedas como tab.find('accept all') devuelvan el botón real de cookies en lugar de
un script en las cabeceras
puede conectarse a una sesión de depuración de chrome en ejecución
__repr__ descriptivo para elementos, que representa el elemento como html
función de utilidad para convertir una instancia de undetected_chromedriver.Chrome en ejecución a una instancia de nodriver.Browser y continuar desde ahí
lleno de ayudantes y métodos de utilidad para las operaciones más usadas e importantes
Partes han sido reescritas para usar conexiones planas en el protocolo.
¿Por qué?
- los iframes están incluidos en la mayoría de las operaciones.
- tab tiene un nuevo método: await tab.get_frames()
que devolverá Iframes que son inspeccionables.
- find() incluirá iframes, por lo que incluso puedes buscar "verify you are human" y
hacer clic en la casilla de verificación en los desafíos js.
Dado que esto requirió bastante reescritura, por favor prueba a fondo, especialmente si ejecutas proyectos grandes.
tab.xpath(selector, timeout=2.5)¡encuentra nodos usando el selector xpath! consulta tab xpath en la documentación de la API
tab.cf_verify()encuentra la casilla de verificación y haz clic en ella con éxito esto solo funciona cuando NO estás en modo experto. actualmente solo incluye inglés integrado requiere que el paquete opencv-python esté instalado
tab.bypass_insecure_connection_warning()método de conveniencia, para la advertencia de página insegura. por ejemplo cuando un certificado no es válido.
tab.open_external_debugger()te permite inspeccionar la pestaña sin romper tu conexión
tab.get_local_storage()obtén el contenido de localstorage
tab.set_local_storage(dict)establece el contenido de localstorage
tab.add_handler(someEvent, callback)el callback puede aceptar un solo argumento (evento), o 2 argumentos (evento, tab).
start(expert=True)hace algunos trucos para usuarios más experimentados. Desactiva la seguridad web y los origin-trials, además de asegurar que las shadow-roots estén siempre abiertas. ¡Esto te hace más detectable!
necesitas tener chrome (o algún navegador basado en chromium) instalado preferiblemente en la ubicación predeterminada en la máquina donde uses este paquete.
cuando se ejecuta en una máquina sin pantalla, como AWS o cualquier otro entorno donde no haya pantalla, es mejor usar alguna herramienta Xvfb para emular una pantalla. alternativamente, este paquete se puede usar en modo headless.
pip install nodriver
pip install -U nodriver
El objetivo de este proyecto (al igual que undetected-chromedriver, en algún momento lejano) es mantenerlo corto y simple, para que puedas abrir rápidamente un editor o una sesión interactiva, escribir o pegar unas pocas líneas y listo.
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())
Omitiré el código repetitivo async aquí
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')
Omitiré el código repetitivo async aquí
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()