
Nachfolger von Undetected-Chromedriver. Bietet ein blitzschnelles Framework für Web-Automatisierung, Web-Scraping, Bots und alle anderen kreativen Ideen, die normalerweise von lästigen Anti-Bot-Systemen wie Captcha / CloudFlare / Imperva / hCaptcha behindert werden.
Die direkte Kommunikation bietet einen noch besseren Schutz gegen Web Application Firewalls (WAFs), während die Leistung massiv gesteigert wird. Dieses Modul ist – anders als undetected-chromedriver – vollständig asynchron.
Was dieses Paket von anderen bekannten Paketen unterscheidet, ist die Optimierung, bei den meisten Anti-Bot-Lösungen unentdeckt zu bleiben.
Ein weiterer Schwerpunkt liegt auf Benutzerfreundlichkeit und schnellem Prototyping, daher kannst du erwarten, dass vieles -as is- funktioniert,
wobei die meisten Methodenparameter best practice-Standardwerte haben.
Mit 1 oder 2 Zeilen ist es einsatzbereit und liefert standardmäßig eine Best-Practice-Konfiguration.
Es räumt anschließend die erzeugten Dateien (Profil) auf.
Bekannt funktionsfähig mit
Während Benutzerfreundlichkeit und Komfort wichtig sind, ist es auch einfach, alles mithilfe der gesamten Palette der verfügbaren CDP-Domänen, Methoden und Ereignisse vollständig anzupassen.
Keine Abhängigkeit von einer Chromedriver-Binärdatei oder Selenium
In 1 Zeile Code einsatzbereit*
verwendet bei jedem Lauf ein frisches Profil und räumt beim Beenden auf
Cookies in Datei speichern und laden, um mühsame Login-Schritte zu vermeiden
tab.find("sometext")
tab.find_all("sometext")
tab.select("a[class*=something]")
tab.select_all("a[href] > div > img")
Intelligente und performante Elementsuche per Selektor oder Text, einschließlich Iframe-Inhalten.
Dies kann auch als Wartebedingung für das Erscheinen eines Elements verwendet werden, da es für die Dauer von erneut versucht, bis es gefunden wird. So kann ein await tab.select('body') als Indikator dafür verwendet werden, ob eine Seite geladen ist.
Die find-Methode sucht nach Text, gibt aber nicht naiv das erste passende Element zurück, sondern gleicht Kandidaten anhand der ähnlichsten Textlänge ab (die kürzeste gewinnt). Dadurch liefern Suchvorgänge wie tab.find('accept all') den tatsächlichen Cookie-Button anstelle eines Skripts im Kopfbereich.
kann sich mit einer laufenden Chrome-Debug-Sitzung verbinden
beschreibendes __repr__ für Elemente, das das Element als HTML darstellt
Hilfsfunktion zum Konvertieren einer laufenden undetected_chromedriver.Chrome-Instanz in eine nodriver.Browser-Instanz und von dort aus fortzufahren
vollgepackt mit Helfern und Hilfsmethoden für die am häufigsten verwendeten und wichtigsten Operationen
Teile wurden neu geschrieben, um im Protokoll Flat-Verbindungen zu verwenden.
Warum?
- Iframes werden in den meisten Operationen berücksichtigt.
- Der Tab hat eine neue Methode: await tab.get_frames(), die überprüfbare Iframes zurückgibt.
- find() berücksichtigt Iframes, sodass du sogar nach „verify you are human“ suchen und das Verifizierungskontrollkästchen in JS-Challenges anklicken kannst.
Da dies einiges an Umschreiben erforderte, teste bitte gründlich, insbesondere wenn du große Projekte ausführst.
tab.xpath(selector, timeout=2.5)findet Knoten mithilfe des XPath-Selektors! siehe tab xpath in der API-Dokumentation
tab.cf_verify()findet das Kontrollkästchen und klickt es erfolgreich dies funktioniert nur, wenn du NICHT im Expertenmodus bist. derzeit ist nur eingebautes Englisch verfügbar erfordert die Installation des Pakets opencv-python
tab.bypass_insecure_connection_warning()Bequemlichkeitsmethode für die Warnung vor unsicheren Seiten, zum Beispiel wenn ein Zertifikat ungültig ist.
tab.open_external_debugger()ermöglicht es dir, den Tab zu inspizieren, ohne deine Verbindung zu unterbrechen
tab.get_local_storage()LocalStorage-Inhalt abrufen
tab.set_local_storage(dict)LocalStorage-Inhalt festlegen
tab.add_handler(someEvent, callback)Der Callback kann ein einzelnes Argument (event) oder 2 Argumente (event, tab) akzeptieren.
start(expert=True)treibt einiges an Hacking für erfahrenere Benutzer. Es deaktiviert Websicherheit und Origin-Trials und stellt außerdem sicher, dass Shadow-Roots immer geöffnet sind. Dadurch wirst du allerdings besser erkennbar!
du benötigst Chrome (oder einen auf Chromium basierenden Browser), installiert vorzugsweise am Standardort auf dem Rechner, auf dem du dieses Paket verwendest.
Wenn du auf einer Headless-Maschine arbeitest, z. B. auf AWS oder in einer anderen Umgebung ohne Display, ist es am besten, ein Xvfb-Werkzeug zu verwenden, um einen Bildschirm zu emulieren. Alternativ kann dieses Paket im Headless-Modus verwendet werden.
pip install nodriver
pip install -U nodriver
Das Ziel dieses Projekts (genau wie bei undetected-chromedriver, vor langer Zeit) ist es, es kurz und einfach zu halten, damit du schnell einen Editor oder eine interaktive Sitzung öffnen, ein paar Zeilen eintippen oder einfügen und loslegen kannst.
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())
Ich lasse den Async-Boilerplate hier weg
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')
Ich lasse den Async-Boilerplate hier weg
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()