Comment Automatiser la Recherche avec Python 3 + Selenium 4 via GitHub Actions
Ce billet traite de l'automatisation des actions de recherche avec Python 3 + Selenium 4 sur GitHub Actions.
Si vous utilisez Meilisearch Cloud avec son plan gratuit, vous recevrez une notification par e-mail de la suppression du projet après 3 jours d'inactivité(*). Il est possible que le système de recherche de votre site web ne soit pas utilisé très souvent. Une recherche automatisée doit être utile pour éviter que le projet ne soit supprimé.
*Vous disposez encore de 58 heures après avoir reçu le message d'avertissement. L'intervalle de fonctionnement minimum requis est donc de 1 fois tous les 3 jours + 58 heures = 130 heures (5,42 jours).
Environnement:
- Python 3.11
- Selenium 4
Aperçu
La structure du dossier est la suivante ;
root
├─ .github/
| └─ workflows/
| └─ run.yml
├─ search.py
└─ requirements.txt
Aperçu du flux de travail
Définissez l'élément d'entrée id
comme id="searchInput"
.
- Exécuter le (1 + 3n)e jour à 0:00 UTC
- Quitter le programme après avoir saisi "a" dans l'élément d'entrée "search".
- Décrire les dépendances dans le fichier requirements.txt
Programme Python lui-même
Spécifier User-Agent pour contourner la protection du serveur anti-bot
Code
name: Run Python script on schedule
on:
schedule:
- cron: "0 15 1,4,7,10,13,16,19,22,25,28,31 * *"
# workflow_dispatch: <- Ajouter pour l'exécution manuelle
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Set up Python environment
uses: actions/setup-python@v4
with:
python-version: 3.11
- name: Cache pip dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install dependencies
run: |
pip install get-chrome-driver --upgrade
pip install -r requirements.txt
- name: Run Python script
run: python search.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import random
# Listes User-Agent
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/B08C3901",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"
]
# Sélectionner aléatoirement un agent utilisateur
user_agent = random.choice(user_agents)
# webdriver
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--headless')
options.add_argument(f'user-agent={user_agent}') # ajouter l'User-Agent
driver = webdriver.Chrome(options=options)
# Si l'élément n'est pas trouvé, attendre 5 secondes
driver.implicitly_wait(5)
# Attendre 5 secondes pour que l'élément prenne effet
wait = WebDriverWait(driver, 5)
# Le site à rechercher
driver.get("https://example.com/")
# Obtenir id="searchInput" et l'entrée "a"
input_element = wait.until(EC.presence_of_element_located((By.ID, "searchInput")))
input_element.send_keys("a")
time.sleep(3)
# Fermer webdriver
driver.quit()
selenium
Code Description
Mesures anti-bots
Le serveur que vous utilisez peut protéger l'accès des robots avec son WAF. Pour éviter cela, j'ai ajouté User-Agent à l'en-tête. Sans cela, Cloudflare a rejeté le programme.
Il serait peut-être préférable de mettre à jour les versions dans le code lorsque la version du navigateur est mise à jour, mais le programme a fonctionné même si la version n'est pas la même que la version actuelle dans la réalité.
Intervalle d'opération
Si vous utilisez ce programme pour le plan gratuit de Meilisearch Cloud, vous avez encore 58 heures après un email d'avertissement. Dans ce programme, je l'exécute le (1 + 3n)
ème jours parce que je ne veux pas recevoir leur email.
GitHub Actions offre 2 000 minutes d'utilisation gratuite par mois pour les dépôts privés (à la date de juin 2023). Ce programme prend environ 30 secondes à exécuter, ce qui représente un total de 5 minutes par mois.
Lien - À propos de la facturation de GitHub Actions - GitHub Docs
J'ai ajouté des lignes pour mettre en cache les dépendances, mais cela ne permet de gagner que quelques secondes.
Si vous voulez économiser du temps d'exécution, réduisez la date ou le temps d'attente.