Einrichten und Ausführen von Chrome und Selenium auf Ubuntu oder Debian. Der Leitfaden basiert auf Ubuntu 22.04
Selenium eignet sich hervorragend zur Automatisierung von Webaufgaben, es kann jedoch schwierig sein, einen Bot rund um die Uhr auf einem Server laufen zu lassen. Durch die Verwendung von systemd können Sie Ihren Selenium-Bot als Hintergrunddienst (Daemon) ausführen und so sicherstellen, dass er zuverlässig läuft und bei einem Fehler neu startet. Dieser Leitfaden führt Sie durch die Schritte zur Einrichtung, wobei der Schwerpunkt auf der Konfiguration für einen Linux-VPS liegt.
Google Chrome installieren
Einrichten der virtuellen Umgebung
Notwendige Pakete installieren
Erstellen des Python-Skripts
Einrichten des systemd-Dienstes
Behebung von Blockpufferungsproblemen
Zugriff auf Protokolle mit „journalctl“
Referenzen
Aktualisieren Sie zunächst alle Pakete.
sudo apt update
Laden Sie das stabile Google Chrome-Paket herunter.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Installieren Sie Google Chrome.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Überprüfen Sie die installierte Google Chrome-Version.
google-chrome --version
Diese Schritte sind nicht obligatorisch, wenn Sie ausschließlich den Selenium-Bot auf Ihrem Computer ausführen. Es wird jedoch empfohlen, wenn Sie an anderen Projekten arbeiten oder isolierte Umgebungen benötigen.
Lasst uns unsere virtuelle Umgebung erstellen.
python3 -m venv venv
Aktivieren Sie die virtuelle Umgebung.
source venv/bin/activate
Jetzt Selenium und Webdriver-Manager installieren.
pip install selenium pip install webdriver-manager
Der Zweck von webdriver-manger besteht darin, die Verwaltung von Binärtreibern für verschiedene Browser zu vereinfachen. Mehr darüber erfahren Sie in der Dokumentation.
## main.py from selenium import webdriver ## ---- Use for type hint ---- ## from selenium.webdriver.chrome.webdriver import WebDriver ## --------------------------- ## from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager def create_chrome_web_driver_connection(headless: bool, detach:bool, use_sandbox: bool, use_dev_shm: bool, window_width: int = 1052, window_height: int = 825 ) -> WebDriver: service = Service(ChromeDriverManager().install()) options = Options() options.add_experimental_option("detach", detach) options.add_argument(f"--window-size={window_width},{window_height}") options.add_argument("--disable-extensions") options.add_argument("--disable-renderer-backgrounding") options.page_load_strategy = 'normal' if not use_sandbox: options.add_argument('--no-sandbox') if not use_dev_shm: options.add_argument('--disable-dev-shm-usage') if headless: options.add_argument("--headless=new") driver = webdriver.Chrome(service= service, options=options) return driver if "__main__" == __name__: driver = create_chrome_web_driver_connection(headless= True, detach= False, use_sandbox= False, use_dev_shm= False) driver.get('https://python.org') print(driver.title) driver.close()
options.add_experimental_option("detach", detach) :
options.add_argument(f"--window-size={window_width},{window_height}") :
Sie können diese Zeile entfernen, wenn Sie möchten.
Wenn Sie Selenium im Headless-Modus ausführen möchten, stellen Sie sicher, dass Sie die Fenstergröße auf diese Weise festlegen. Andernfalls könnte meiner Erfahrung nach die Standardfenstergröße zu klein sein.Sie können Ihre Fenstergröße mit diesem Befehl drivers.get_window_size()
überprüfen
options.add_argument("--disable-extensions") :
options.add_argument("--disable-renderer-backgrounding") :
options.page_load_strategy = 'normal' :
options.add_argument('--no-sandbox') :
options.add_argument('--disable-dev-shm-usage') :
options.add_argument("--headless=new") :
Falls Ihr Selenium-Programm Umgebungsvariablen verwenden muss, gibt es zwei Möglichkeiten, dies zu erreichen:
Verwendung einer .env-Datei mit einer Bibliothek wie python-dotenv (die häufigere/beliebtere Methode).
Verwenden der integrierten Option von systemd zum Einrichten einer Umgebungsdatei.
Für dieses Beispiel verwenden wir die zweite Option.
Zuerst erstellen wir ein Verzeichnis conf.d im Verzeichnis /etc.
sudo apt update
Als nächstes erstellen Sie eine Nur-Text-Datei (dies wird unsere Umgebungsdatei sein).
sudo apt update
Jetzt können Sie Ihre Umgebungsvariablen zu der soeben erstellten Datei hinzufügen.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Ändern Sie das Python-Skript, um die Umgebungsvariablen zu verwenden.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Sie müssen eine Servicedatei in diesem /etc/systemd/system/-Verzeichnis erstellen; Hier sollten vom Systemadministrator installierte Systemd-Einheiten platziert werden.
google-chrome --version
Für dieses Beispiel gehe ich davon aus, dass Sie sich in einem VPS befinden und den Dienst als Root-Benutzer ausführen möchten.
[!WARNING]
Der Dienst wird mit Root-Rechten (Administrator) ausgeführt. Dadurch erhält es vollen Zugriff auf das System, die Ausführung als Root wird jedoch normalerweise vermieden, es sei denn, dies ist aus Sicherheitsgründen erforderlich.
Fügen Sie dies zur Servicedatei hinzu.
python3 -m venv venv
In diesem Abschnitt werden Metadaten und Abhängigkeiten für den Dienst definiert.
Description=Selenium Bot Service: Bietet eine kurze Beschreibung der Funktionsweise des Dienstes. In diesem Fall wird es als „Selenium Bot Service“ bezeichnet. Diese Beschreibung wird in Systemprotokollen und von systemctl verwendet, um den Dienst zu identifizieren.
After=network.target: Dadurch wird sichergestellt, dass der Dienst erst startet, wenn das Netzwerk verfügbar ist. Das network.target ist ein Systemd-Ziel, das anzeigt, dass grundlegende Netzwerkfunktionen verfügbar sind.
In diesem Abschnitt wird die Konfiguration des Dienstes selbst angegeben, einschließlich der Art und Weise, wie er ausgeführt wird, welcher Benutzer ihn ausführt und was zu tun ist, wenn er fehlschlägt.
Benutzer: Gibt den Benutzer an, unter dem der Dienst ausgeführt wird. Hier ist es auf root eingestellt.
EnvironmentFile: Gibt eine Datei an, die vom Dienst verwendete Umgebungsvariablen enthält.
WorkingDirectory: Gibt das Verzeichnis an, von dem aus der Dienst ausgeführt wird. Dies ist das Arbeitsverzeichnis für den Dienstprozess. Hier werden die Bot-Dateien in /root/selenium_bot/
gespeichertExecStart: Definiert den Befehl zum Starten des Dienstes. Hier wird die Datei main.py in /root/selenium_bot/
ausgeführtRestart=on-failure : Konfiguriert den Dienst so, dass er automatisch neu gestartet wird, wenn er mit einem Fehler beendet wird (d. h. mit einem Beendigungsstatus ungleich Null). Dies ist nützlich, um sicherzustellen, dass der Bot-Dienst auch bei gelegentlichen Ausfällen weiterhin ausgeführt wird.
RestartSec=5s: Gibt die Verzögerung zwischen Neustarts im Fehlerfall an. In diesem Fall wartet der Dienst 5 Sekunden, bevor er nach einem Fehler versucht, neu zu starten.
StandardOutput=journal: Leitet die Standardausgabe (stdout) des Dienstes an das Systemd-Journal um, das mit „journalctl“ angezeigt werden kann. Dies ist für Protokollierungs- und Debugging-Zwecke nützlich.
StandardError=journal: Leitet die Standardfehlerausgabe (stderr) in das Systemd-Journal um. Alle vom Dienst festgestellten Fehler werden protokolliert und können auch mit „journalctl“ angezeigt werden
In diesem Abschnitt wird definiert, wie und wann der Dienst aktiviert oder gestartet werden soll.
WantedBy=multi-user.target: Gibt das Ziel an, unter dem der Dienst aktiviert werden soll. In diesem Fall ist multi-user.target ein Systemd-Ziel, das erreicht wird, wenn sich das System in einem nicht-grafischen Mehrbenutzermodus befindet (üblich bei Servern). Dies bedeutet, dass der Dienst gestartet wird, wenn das System dieses Ziel erreicht, normalerweise wenn das System in einer Mehrbenutzerumgebung gestartet wurde.
Um mehr über alle möglichen Einstellungen für einen systemd-Dienst zu erfahren, schauen Sie sich die Referenzen an
Überprüfen wir, ob unsere Servicedatei gültig ist. Wenn alles in Ordnung ist, sollte nichts angezeigt werden.
sudo apt update
Laden Sie die Systemd-Konfiguration neu und suchen Sie nach neuen oder geänderten Einheiten (Diensten).
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Starten/neustarten Sie Ihren Dienst.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Beenden Sie Ihren Dienst.
google-chrome --version
Überprüfen Sie Ihren Servicestatus.
python3 -m venv venv
Tun Sie dies, wenn Sie möchten, dass Ihr Dienst beim Booten automatisch gestartet wird.
source venv/bin/activate
Wenn Sie in Python Ihr Skript in einer interaktiven Umgebung ausführen (z. B. wenn Sie python3 filename.py manuell in einem Terminal ausführen), verwendet Python die Zeilenpufferung. Dies bedeutet, dass die Ausgabe, wie die einer print()-Anweisung, sofort angezeigt wird.
Wenn das Python-Programm jedoch in einer nicht interaktiven Umgebung ausgeführt wird (dies ist unser Fall), verwendet die Ausgabe Blockpufferung. Das bedeutet, dass das Programm seine Ausgabe in einem Puffer speichert, bis der Puffer voll ist oder das Programm endet, und verzögert, bis Sie Protokolle/Ausgaben sehen können.
Mehr darüber, wie die Ausgabepufferung von Python funktioniert, erfahren Sie hier.
Da wir Protokolle und Ausgaben in Echtzeit anzeigen möchten, können wir dieses Problem auf zwei Arten beheben.
Das sagen uns die Python3-Dokumente.
-u Erzwingt, dass die Streams stdout und stderr ungepuffert sind. Diese Option hat keine Auswirkung auf den stdin-Stream
Durch die Verwendung des Flags -u arbeitet Python sowohl für stdout als auch für stderr in einem vollständig ungepufferten Modus. Das bedeutet, dass jedes Byte direkt nach seiner Erzeugung direkt an das Terminal (oder einen beliebigen Ausgabestream wie eine Protokolldatei) gesendet wird. Es findet überhaupt keine Pufferung statt.
Jedes Zeichen, das normalerweise an stdout gesendet wird (z. B. aus print()-Anweisungen oder Fehlern), wird sofort Byte für Byte geschrieben, ohne dass darauf gewartet werden muss, dass sich eine vollständige Zeile oder ein vollständiger Puffer ansammelt.
Um diese Option zu verwenden, führen Sie Ihr Skript wie folgt aus:
sudo apt update
Wenn Sie sich für diese Option entscheiden, stellen Sie sicher, dass Sie ExecStart in der Servicedatei ändern.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
In Python puffert die Funktion print() ihre Ausgabe standardmäßig, d. h. sie speichert die Ausgabe im Speicher und schreibt sie nur aus, wenn der Puffer voll ist oder das Programm endet. Durch die Verwendung von „flush=True“ können Sie Python zwingen, die Ausgabe sofort nach dem print()-Aufruf zu leeren, um sicherzustellen, dass die Ausgabe sofort erscheint.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Um den vollständigen Protokollverlauf Ihrer Systemd-Einheit (Dienst) anzuzeigen, verwenden Sie den folgenden Befehl.
google-chrome --version
Um Protokolle in Echtzeit zu überwachen, verwenden Sie das Flag -f. Dadurch werden nur die neuesten Journaleinträge angezeigt und neue Einträge werden fortlaufend gedruckt, sobald sie an das Journal angehängt werden.
python3 -m venv venv
Das obige ist der detaillierte Inhalt vonSo richten Sie Selenium als Linux-Daemon mit systemd ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!