Configurer et exécuter Chrome et Selenium sur Ubuntu ou Debian. Le guide est basé sur Ubuntu 22.04
Selenium est idéal pour automatiser les tâches Web, mais garder un bot fonctionnant 24h/24 et 7j/7 sur un serveur peut être délicat. En utilisant systemd, vous pouvez exécuter votre bot Selenium en tant que service d'arrière-plan (démon), garantissant qu'il fonctionne de manière fiable et redémarre en cas d'échec. Ce guide vous guidera à travers les étapes de configuration, en mettant l'accent sur sa configuration pour un VPS Linux.
Installation de Google Chrome
Mise en place de l'environnement virtuel
Installation des packages nécessaires
Création du script Python
Configuration du service systemd
Résolution des problèmes de mise en mémoire tampon des blocs
Accès aux journaux à l'aide de journalctl
Références
Tout d'abord, mettez à jour tous les packages.
sudo apt update
Téléchargez le package Google Chrome stable.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Installez Google Chrome.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Vérifiez la version de Google Chrome installée.
google-chrome --version
Ces étapes ne sont pas obligatoires si vous exécutez uniquement le bot Selenium sur votre machine. Cependant, cela est recommandé si vous travaillez sur d'autres projets ou si vous avez besoin d'environnements isolés.
Créons notre environnement virtuel.
python3 -m venv venv
Activez l'environnement virtuel.
source venv/bin/activate
Maintenant, installez Selenium et webdriver-manager.
pip install selenium pip install webdriver-manager
Le but de webdriver-manger est de simplifier la gestion des pilotes binaires pour différents navigateurs. Vous pouvez en apprendre davantage dans sa documentation.
## 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}") :
Vous pouvez supprimer cette ligne si vous le souhaitez.
Si vous envisagez d'exécuter Selenium en mode sans tête, assurez-vous de définir la taille de la fenêtre de cette façon ; sinon, d'après mon expérience, la taille de la fenêtre par défaut pourrait être trop petite.Vous pouvez vérifier la taille de votre fenêtre avec cette commande driver.get_window_size()
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") :
Si votre programme Selenium doit utiliser des variables d'environnement, vous pouvez y parvenir de deux manières :
Utiliser un fichier .env avec une bibliothèque comme python-dotenv (la méthode la plus courante/populaire).
Utilisation de l'option intégrée de systemd pour configurer un fichier d'environnement.
Pour cet exemple, nous utiliserons la deuxième option.
Tout d'abord, créons un répertoire conf.d dans le répertoire /etc.
sudo apt update
Ensuite, créez un fichier texte brut (ce sera notre fichier d'environnement).
sudo apt update
Vous pouvez maintenant ajouter vos variables d'environnement au fichier que nous venons de créer.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Modifiez le script Python pour utiliser les variables d'environnement.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Vous devez créer un fichier de service dans ce répertoire /etc/systemd/system/ ; c'est ici que doivent être placées les unités systemd installées par l'administrateur système.
google-chrome --version
Pour cet exemple, je vais supposer que vous êtes dans un VPS et que vous souhaitez exécuter le service en tant qu'utilisateur root.
[!AVERTISSEMENT]
Le service fonctionnera avec les privilèges root (administrateur). Cela lui donne un accès complet au système, mais son exécution en tant que root est généralement évitée, sauf si cela est nécessaire pour des raisons de sécurité.
Ajoutez ceci au fichier de service.
python3 -m venv venv
Cette section définit les métadonnées et les dépendances du service.
Description=Selenium Bot Service : Fournit une brève description de ce que fait le service. Dans ce cas, il le décrit comme le « service Bot Selenium ». Cette description est utilisée dans les journaux système et par systemctl pour identifier le service.
After=network.target : Cela garantit que le service démarre uniquement une fois le réseau disponible. Le network.target est une cible systemd qui indique que la fonctionnalité réseau de base est active.
Cette section spécifie la configuration du service lui-même, y compris son fonctionnement, quel utilisateur l'exécute et que faire en cas d'échec.
Utilisateur : Spécifie l'utilisateur sous lequel le service s'exécutera. Ici, il est défini sur root.
EnvironmentFile : Spécifie un fichier qui contient les variables d'environnement utilisées par le service.
WorkingDirectory : Spécifie le répertoire à partir duquel le service sera exécuté. Il s'agit du répertoire de travail du processus de service. Ici, les fichiers du bot sont stockés dans /root/selenium_bot/
ExecStart : Définit la commande pour démarrer le service. Ici, il exécute le fichier main.py dans /root/selenium_bot/
Restart=on-failure : configure le service pour qu'il redémarre automatiquement s'il se termine avec un échec (c'est-à-dire un statut de sortie différent de zéro). Ceci est utile pour garantir que le service du bot reste opérationnel, même en cas de pannes occasionnelles.
RestartSec=5s : Spécifie le délai entre les redémarrages en cas d'échec. Dans ce cas, le service attendra 5 secondes avant de tenter de redémarrer après un échec.
StandardOutput=journal : Redirige la sortie standard (stdout) du service vers le journal systemd, qui peut être consulté à l'aide de journalctl. Ceci est utile à des fins de journalisation et de débogage.
StandardError=journal : Redirige la sortie d'erreur standard (stderr) vers le journal systemd. Toutes les erreurs rencontrées par le service seront enregistrées et pourront également être consultées à l'aide de journalctl
Cette section définit comment et quand le service doit être activé ou démarré.
WantedBy=multi-user.target : Spécifie la cible sous laquelle le service doit être activé. Dans ce cas, multi-user.target est une cible systemd qui est atteinte lorsque le système est en mode multi-utilisateur non graphique (courant sur les serveurs). Cela signifie que le service sera démarré lorsque le système atteint cet objectif, généralement lorsque le système aura démarré dans un environnement multi-utilisateurs.
Pour en savoir plus sur tous les paramètres possibles pour un service systemd, consultez les références
Vérifions que notre fichier de service est valide ; si tout va bien, rien ne devrait être affiché.
sudo apt update
Rechargez la configuration systemd, à la recherche d'unités (services) nouvelles ou modifiées.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Démarrez/Redémarrez votre service.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Arrêtez votre service.
google-chrome --version
Vérifiez l'état de votre service.
python3 -m venv venv
Faites ceci si vous souhaitez que votre service démarre automatiquement au démarrage.
source venv/bin/activate
En Python, lorsque vous exécutez votre script dans un environnement interactif (par exemple, lorsque vous exécutez manuellement python3 filename.py dans un terminal), Python utilise la mise en mémoire tampon de ligne. Cela signifie que le résultat, comme celui d'une instruction print(), est affiché immédiatement.
Cependant, lorsque le programme Python est exécuté dans un environnement non interactif (c'est notre cas), la sortie utilisera la mise en mémoire tampon de blocs. Cela signifie que le programme conservera sa sortie dans un tampon jusqu'à ce que le tampon soit plein ou que le programme se termine, retardant ainsi le moment où vous pourrez voir les journaux/sorties.
Vous pouvez en savoir plus sur le fonctionnement de la mise en mémoire tampon de sortie de Python ici.
Puisque nous souhaitons afficher les journaux et les résultats en temps réel, nous pouvons résoudre ce problème de deux manières.
La documentation python3 nous le dit.
-u Force la suppression des flux stdout et stderr. Cette option n'a aucun effet sur le flux stdin
En utilisant l'indicateur -u, Python fonctionne dans un mode entièrement sans tampon pour stdout et stderr. Cela signifie que chaque octet est envoyé directement au terminal (ou à tout flux de sortie comme un fichier journal) dès qu'il est produit. Aucune mise en mémoire tampon n'a lieu.
Chaque caractère qui serait généralement envoyé vers la sortie standard (comme à partir d'instructions ou d'erreurs print()) est immédiatement écrit, octet par octet, sans attendre qu'une ligne complète ou un tampon ne s'accumule.
Pour utiliser cette option, exécutez votre script comme ceci :
sudo apt update
Si vous optez pour cette option, assurez-vous de modifier ExecStart dans le fichier de service.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
En Python, la fonction print() met sa sortie en mémoire tampon par défaut, ce qui signifie qu'elle stocke la sortie en mémoire et ne l'écrit que lorsque le tampon est plein ou que le programme se termine. En utilisant flush=True, vous pouvez forcer Python à vider la sortie immédiatement après l'appel print(), garantissant ainsi que la sortie apparaît immédiatement.
sudo apt install -y ./google-chrome-stable_current_amd64.deb
Pour afficher l'historique complet des journaux de votre unité systemd (service), utilisez la commande suivante.
google-chrome --version
Pour surveiller les journaux en temps réel, utilisez l'indicateur -f. Cela affichera uniquement les entrées de journal les plus récentes et imprimera en continu les nouvelles entrées au fur et à mesure qu'elles sont ajoutées au journal.
python3 -m venv venv
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!