[PYTHON] Récupérer le csv publié avec Github Action et le publier sur les pages Github

introduction

À propos de ce programme

Open data (csv) diffusé depuis la préfecture de Gifu, ・ Grattez régulièrement avec des actions github -Output un fichier json comme un simple tableau de dictionnaire sans modification ・ S'il y a une différence, appuyez sur la branche gh-pages ・ Vous pouvez accéder au fichier json directement sur les pages github C'est un programme.

Contexte de la publication

Ce programme a été développé pour le développement du site Antivirus Corona de la préfecture de Gifu. Bien qu'il soit publié dans d'autres cas, le traitement est inclus dans la sortie csv-> json, et il est De nombreuses corrections ont été nécessaires pour référence. Par conséquent, dans ce programme, le traitement est réduit au minimum et les données csv d'origine peuvent être sorties telles quelles dans un format qui facilite le développement pour d'autres développeurs.

Product Github https://github.com/CODE-for-GIFU/covid19-scraping

Sortie Json sur les pages Github

http://code-for-gifu.github.io/covid19-scraping/patients.json http://code-for-gifu.github.io/covid19-scraping/testcount.json http://code-for-gifu.github.io/covid19-scraping/callcenter.json http://code-for-gifu.github.io/covid19-scraping/advicecenter.json

Fichier CSV de référence

Données ouvertes de la préfecture de Gifu https://data.gifu-opendata.pref.gifu.lg.jp/dataset/c11223-001

how to use

Exécuter sur Github

méthode de départ

Comment arrêter

main.yml


on:
  schedule:
    - cron: "*/10 * * * *”

Hébergement sur les pages Github

Pour plus de détails, reportez-vous au document officiel de l'action github. https://help.github.com/ja/actions

Exécuter dans un environnement local

pip install -r requirements.txt
python3 main.py

Un fichier json sera généré dans le dossier / data.

Documentation technique

python

Principale

main.py


os.makedirs('./data', exist_ok=True)
for remotes in REMOTE_SOURCES:
    data = import_csv_from(remotes['url'])
    dumps_json(remotes['jsonname'], data)

Section de définition des données

settings.py


#Définition des ressources externes
REMOTE_SOURCES = [
    {
        'url': 'https://opendata-source.com/source1.csv',
        'jsonname': 'source1.json',
    },
    {
        'url': 'https://opendata-source.com/source2.csv',
        'jsonname': 'source2.json',
    },
    {
        'url': 'https://opendata-source.com/source3.csv',
        'jsonname': 'source3.json',
    },
    {
        'url': 'https://opendata-source.com/source4.csv',
        'jsonname': 'source4.json',
    }
]

partie lecture csv

main.py


def import_csv_from(csvurl):
    request_file = urllib.request.urlopen(csvurl)
    if not request_file.getcode() == 200:
        return

    f = decode_csv(request_file.read())
    filename = os.path.splitext(os.path.basename(csvurl))[0]
    datas = csvstr_to_dicts(f)
    timestamp = (request_file.getheader('Last-Modified'))

    return {
        'data': datas,
        'last_update': dateutil.parser.parse(timestamp).astimezone(JST).isoformat()
    }

partie de décodage csv

main.py


def decode_csv(csv_data):
    print('csv decoding')
    for codec in CODECS:
        try:
            csv_str = csv_data.decode(codec)
            print('ok:' + codec)
            return csv_str
        except:
            print('ng:' + codec)
            continue
    print('Appropriate codec is not found.')

csv → unité de conversion de données json

main.py


def csvstr_to_dicts(csvstr):
    datas = []
    rows = [row for row in csv.reader(csvstr.splitlines())]
    header = rows[0]
    for i in range(len(header)):
        for j in range(len(UNUSE_CHARACTER)):
            header[i] = header[i].replace(UNUSE_CHARACTER[j], '')

    maindatas = rows[1:]
    for d in maindatas:
        #Ignorer les lignes vides
        if d == []:
            continue
        data = {}
        for i in range(len(header)):
            data[header[i]] = d[i]
        datas.append(data)
    return datas

section de sortie de données json

main.py


def dumps_json(file_name: str, json_data: Dict):
    with codecs.open("./data/" + file_name, "w", "utf-8") as f:
        f.write(json.dumps(json_data, ensure_ascii=False,
                           indent=4, separators=(',', ': ')))

Github Action Il est construit avec un fichier yml.

Programme

main.yml


on:
    schedule:
     - cron: "*/10 * * * *”

partie d'exécution de script python

main.yml


    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.8
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
      - name: Run script
        run: |
          python main.py

pousser vers gh-pages

main.yml


      - name: deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./data
          publish_branch: gh-pages

Les références

Hokkaido: script Python pour le scraping --covid19hokkaido_scraping https://github.com/Kanahiro/covid19hokkaido_scraping/blob/master/main.py

Recommended Posts

Récupérer le csv publié avec Github Action et le publier sur les pages Github
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
Prédisez la quantité d'énergie utilisée en 2 jours et publiez-la au format CSV
Extraire le résultat de la commande TOP avec USER et le sortir au format CSV
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
Gratter l'holojour et l'afficher dans la CLI
Jusqu'à ce que la documentation Sphinx soit publiée sur GitHub
Le gars qui a trébuché lorsque Pelican n'a pas pu publier son blog sur les pages Github
Installez le sélénium sur votre Mac et essayez-le avec python
Lisez le fichier csv et affichez-le dans le navigateur
POSTER l'image avec json et la recevoir avec flask
Récupérez la chaîne correspondante dans l'expression régulière et réutilisez-la lors du remplacement sur Python3
Mettez Ubuntu dans Raspi, mettez Docker dessus et contrôlez GPIO avec python à partir du conteneur
Créer un nouveau csv avec des pandas basé sur le csv local
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
Prenez une image avec Pepper et affichez-la sur votre tablette
Déguisez l'herbe sur GitHub et essayez de devenir ingénieur.
Installez lp_solve sur Mac OSX et appelez-le avec python.
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)