Scraping avec GitHub Actions

Automatisation du scraping avec GitHub Actions

J’ai récemment dû exécuter un script de scraping quotidiennement afin de récupérer des articles de presse à partir de flux RSS (en savoir plus). Pour ce faire j’ai décidé d’utiliser GitHub Actions. Voyons ensemble comment faire.

Nous souhaitons que notre flux de travail puisse :


Déclenchement du workflow selon un horaire

Pour déclencher le workflow selon un horaire, nous pouvons utiliser l’événement schedule (voir la documentation). L’horaire est défini à l’aide d’une syntaxe cron (voir la documentation).

on:
  schedule:
    - cron: "0 21 * * *" # s'exécute tous les jours à 21 h 00 UTC

Récupération de la dernière version du repository

Pour récupérer la dernière version du repository, nous pouvons utiliser l’action actions/checkout (voir la documentation). Cette action va extraire le contenu du repository vers l’exécuteur GitHub.

steps:
  - name: checkout repo content
    uses: actions/checkout@v3 # extraire le contenu du repository vers l'exécuteur GitHub

Exécution d’un script Python

Pour exécuter un script Python, nous devons configurer Python et installer les paquets requis. Nous pouvons utiliser l’action actions/setup-python (voir la documentation). Cette action va configurer Python et pip sur l’exécuteur GitHub. Ensuite, nous pouvons installer les librairies requies pour notre utilisation à l’aide de pip install -r requirements.txt.

steps:
  - name: setup python
    uses: actions/setup-python@v4 # configurer Python
    with:
      python-version: '3.9'
      
  - name: install python packages # installer les paquets à partir de requirements.txt
    run: |
      python -m pip install --upgrade pip
      pip install -r requirements.txt      

Nous pouvons également ajouter d’autres étapes pour installer des paquets spécifiques. Par exemple, j’ai dû installer le modèle français pour Spacy, ce qui peut être fait en utilisant python -m spacy download fr_core_news_lg.

steps:
  - name: install spacy french model
    run: python -m spacy download fr_core_news_lg # installer le modèle français pour Spacy (utilisé par mon script)

Enfin, nous pouvons exécuter notre script Python nommé run.py en utilisant python run.py.

steps:
  - name: execute py script # exécuter run.py
    run: python run.py

Commit et push les modifications sur le repository

Pour valider et envoyer les modifications sur le repository, nous pouvons utiliser l’action ad-m/github-push-action (voir la documentation). Cette action va valider et envoyer les modifications sur le repository. Nous devons configurer l’action pour utiliser la variable secrète GITHUB_TOKEN (voir la documentation) afin de permettre l’envoi des modifications sur le repository. Pour ce faire nous devons donner l’autorisation d’écriture au GITHUB_TOKEN dans les paramètres du repository :

github-token-settings

Le workflow génère ensuite automatiquement son propre token, qui est stocké dans la variable secrète GITHUB_TOKEN. Ce token est utilisé pour autoriser l’envoi des modifications sur le repository. Nous allons envoyer les modifications directement sur la branche main.

steps:
  - name: commit files
    run: |
        git config --local user.email "action@github.com"
        git config --local user.name "GitHub Action"
        git add -A
        git diff-index --quiet HEAD || (git commit -a -m "logs mis à jour" --allow-empty)
                  
  - name: push changes
    uses: ad-m/github-push-action@v0.6.0
    with:
        github_token: ${{ secrets.GITHUB_TOKEN }} # GITHUB_TOKEN est une variable secrète générée automatiquement par GitHub Actions
        branch: main # envoyer vers la branche main

Résumé

Pour résumer, voici le workflow complet :

name: cron_scrap

on:
  schedule:
    - cron: "0 21 * * *" # s'exécute tous les jours à 21 h 00 UTC

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: checkout repo content
        uses: actions/checkout@v3 # extraire le contenu du repository vers l'exécuteur GitHub
        
      - name: setup python
        uses: actions/setup-python@v4 # configurer Python
        with:
          python-version: '3.9'
          
      - name: install python packages # installer les paquets à partir de requirements.txt
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt 
                    
      - name: install spacy french model
        run: python -m spacy download fr_core_news_lg # installer le modèle français pour Spacy (utilisé par mon script)
        
      - name: execute py script # exécuter run.py
        run: python run.py
          
      - name: commit files
        run: |
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"
          git add -A
          git diff-index --quiet HEAD || (git commit -a -m "logs mis à jour" --allow-empty)
                    
      - name: push changes
        uses: ad-m/github-push-action@v0.6.0
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }} # GITHUB_TOKEN est une variable secrète générée automatiquement par GitHub Actions
          branch: main # envoyer vers la branche main

J’espère que vous avez trouvé ces explications sur la façon d’exécuter un script de scraping selon un horaire en utilisant GitHub Actions utiles !