Heim > Backend-Entwicklung > Python-Tutorial > So richten Sie Selenium als Linux-Daemon mit systemd ein

So richten Sie Selenium als Linux-Daemon mit systemd ein

Mary-Kate Olsen
Freigeben: 2024-10-18 18:17:29
Original
551 Leute haben es durchsucht

How to Set Up Selenium as a Linux Daemon with systemd

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.

Inhaltsverzeichnis

  1. Google Chrome installieren

  2. Einrichten der virtuellen Umgebung

  3. Notwendige Pakete installieren

  4. Erstellen des Python-Skripts

  5. Einrichten des systemd-Dienstes

    • ENV-Variablen hinzufügen (optional)
    • Servicedatei
    • Ausführen des Dienstes
  6. Behebung von Blockpufferungsproblemen

    • Verwendung der Flagge -u
    • Verwendung des Print-Flush-Arguments
  7. Zugriff auf Protokolle mit „journalctl“

  8. Referenzen


Google Chrome installieren

Aktualisieren Sie zunächst alle Pakete.

sudo apt update
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Laden Sie das stabile Google Chrome-Paket herunter.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Installieren Sie Google Chrome.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Überprüfen Sie die installierte Google Chrome-Version.

google-chrome --version
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Einrichten der virtuellen Umgebung

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Aktivieren Sie die virtuelle Umgebung.

source venv/bin/activate
Nach dem Login kopieren
Nach dem Login kopieren

Notwendige Pakete installieren

Jetzt Selenium und Webdriver-Manager installieren.

pip install selenium
pip install webdriver-manager
Nach dem Login kopieren

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.


Erstellen des Python-Skripts

## 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()

Nach dem Login kopieren

options.add_experimental_option("detach", detach) :

  • Damit können Sie konfigurieren, ob der Chrome-Browser geöffnet bleibt, nachdem die Ausführung des Skripts abgeschlossen ist.
  • Wenn „detach“ „True“ ist, bleibt das Browserfenster auch nach Ende der WebDriver-Sitzung geöffnet.

options.add_argument(f"--window-size={window_width},{window_height}") :

  • Dies legt die Fenstergröße für den Browser in Bezug auf Breite und Höhe fest.

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") :

  • Erweiterungen können automatisierte Browserinteraktionen beeinträchtigen, daher kann ihre Deaktivierung die Stabilität verbessern.

options.add_argument("--disable-renderer-backgrounding") :

  • Dadurch wird verhindert, dass Chrome Hintergrund-Tabs priorisiert oder anhält.
  • Dies kann nützlich sein, wenn Sie Aktionen auf mehreren Registerkarten ausführen.

options.page_load_strategy = 'normal' :

  • Dadurch wird die Seitenladestrategie auf „Normal“ gesetzt, was bedeutet, dass Selenium wartet, bis die Seite vollständig geladen ist, bevor es mit weiteren Befehlen fortfährt.
  • Zu den weiteren Optionen gehören „eager“ (warten, bis das DOMContentLoaded-Ereignis auftritt) und „none“ (nicht warten, bis die Seite geladen wird). Weitere Informationen dazu finden Sie hier.

options.add_argument('--no-sandbox') :

  • Die Sandbox ist eine Sicherheitsfunktion von Chrome, die die Prozesse des Browsers isoliert.
  • Das Deaktivieren (--no-sandbox) kann in einigen Testumgebungen (z. B. in Docker-Containern oder beim Ausführen des Skripts als Root-Benutzer) nützlich sein, in denen die Sandbox Berechtigungsprobleme oder Abstürze verursacht.

options.add_argument('--disable-dev-shm-usage') :

  • /dev/shm ist ein gemeinsam genutzter Speicherbereich, der häufig in Linux-Umgebungen verwendet wird. Standardmäßig versucht Chrome, die Leistung zu verbessern.
  • Das Deaktivieren dieser Funktion (--disable-dev-shm-usage) kann Abstürze in Umgebungen verhindern, in denen der gemeinsam genutzte Speicher begrenzt ist.

options.add_argument("--headless=new") :

  • Dadurch wird der Headless-Modus aktiviert, der Chrome ohne GUI ausführt.
  • Der Headless-Modus ist nützlich für die Ausführung in Umgebungen ohne Anzeige, wie z. B. CI/CD-Pipelines oder Remote-Server.

Einrichten des systemd-Dienstes

ENV-Variablen hinzufügen (optional)

Falls Ihr Selenium-Programm Umgebungsvariablen verwenden muss, gibt es zwei Möglichkeiten, dies zu erreichen:

  1. Verwendung einer .env-Datei mit einer Bibliothek wie python-dotenv (die häufigere/beliebtere Methode).

  2. 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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Als nächstes erstellen Sie eine Nur-Text-Datei (dies wird unsere Umgebungsdatei sein).

sudo apt update
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Ändern Sie das Python-Skript, um die Umgebungsvariablen zu verwenden.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Servicedatei

Sie müssen eine Servicedatei in diesem /etc/systemd/system/-Verzeichnis erstellen; Hier sollten vom Systemadministrator installierte Systemd-Einheiten platziert werden.

google-chrome --version
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Abschnitt [Einheit].

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.

Abschnitt [Service].

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/

gespeichert

ExecStart: Definiert den Befehl zum Starten des Dienstes. Hier wird die Datei main.py in /root/selenium_bot/

ausgeführt

Restart=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

Abschnitt [Installieren].

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

Ausführen des Dienstes

Überprüfen wir, ob unsere Servicedatei gültig ist. Wenn alles in Ordnung ist, sollte nichts angezeigt werden.

sudo apt update
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Starten/neustarten Sie Ihren Dienst.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Beenden Sie Ihren Dienst.

google-chrome --version
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Überprüfen Sie Ihren Servicestatus.

python3 -m venv venv
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Tun Sie dies, wenn Sie möchten, dass Ihr Dienst beim Booten automatisch gestartet wird.

source venv/bin/activate
Nach dem Login kopieren
Nach dem Login kopieren

Behebung von Blockpufferungsproblemen

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.

Verwendung des Flags -u

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Verwenden des Print-Flush-Arguments

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Zugriff auf Protokolle mit „journalctl“.

Um den vollständigen Protokollverlauf Ihrer Systemd-Einheit (Dienst) anzuzeigen, verwenden Sie den folgenden Befehl.

google-chrome --version
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Referenzen

  • https://github.com/password123456/setup-selenium-with-chrome-driver-on-ubuntu_debian
  • https://www.selenium.dev/documentation/webdriver/drivers/options/
  • https://www.lambdatest.com/blog/selenium-page-load-strategy/
  • https://pypi.org/project/webdriver-manager/
  • https://pypi.org/project/python-dotenv/
  • https://wiki.archlinux.org/title/Systemd
  • https://man.archlinux.org/man/systemctl.1
  • https://man.archlinux.org/man/systemd.service.5.en#EXAMPLES
  • https://man.archlinux.org/man/systemd-analyze.1
  • https://docs.python.org/3/using/cmdline.html#cmdoption-u
  • https://realpython.com/python-flush-print-output/
  • https://man.archlinux.org/man/journalctl.1

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage