[Python] Lisez automatiquement les informations par préfecture du nouveau virus corona du PDF du ministère de la Santé, du Travail et du Bien-être social et écrivez-les dans un tableur ou Excel.

introduction

Des informations sur le nouveau virus corona, mises à jour quotidiennement, sont publiées sur le site Web du ministère de la Santé, du Travail et des Affaires sociales. Communiqué de presse sur la nouvelle infection à coronavirus (situation d'épidémie, épidémie de patients nationaux, situation à l'étranger, etc.) À partir de là, j'ai créé un programme qui recueille des données détaillées par préfecture (bien qu'il ne s'agisse que de données après 5/10 avec le même format PDF) et les enregistre dans Google SpreadSheet ou Excel, je voudrais donc le présenter.

Comme il est enregistré dans un logiciel de calcul de table, vous pouvez facilement obtenir une vue d'ensemble des changements dans le nombre de personnes infectées et le taux d'aggravation en les graphiques plus tard.

Préparation

Si vous l'utilisez dans Excel, vous pouvez l'utiliser tel quel, mais vous devez vous préparer un peu pour accéder à Google SpreadSheet à partir d'un programme Python. Veuillez consulter le site suivant, etc., préparez-vous et entrez le nom du fichier json et la clé de la feuille de calcul dans la partie commentaire (autour de la ligne 105) du programme. [N'hésitez plus] Résumé des paramètres initiaux de lecture et d'écriture sur des feuilles de calcul avec Python Modifier la feuille de calcul Google en Python

programme

import requests
import re
import regex
from bs4 import BeautifulSoup
from tika import parser
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import openpyxl
import pickle

isGss = False if bool(int(input("1. GoogleSpreadSheet  2. Excel    ")) -
                      1) else True

req = requests.get(
    "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000121431_00086.html")
req.encoding = 'utf-8'
soup = BeautifulSoup(req.text, 'html.parser')

urls = {}
try:
    with open("dates.pickle", "rb") as f:
        dates = pickle.load(f)
except:
    dates = []
column_cnt = len(dates) + 2

for i in soup.select("div[class='m-grid__col1']")[1].find_all("a"):
    url = i["href"]
    if "À propos de la situation actuelle de la nouvelle infection à coronavirus et de la réponse du ministère de la Santé, du Travail et du Bien-être social" not in i.text: continue
    b = re.findall("Reiwa\d{1,2}Année\d{1,2}Mois\d{1,2}journée", i.text)
    if b: date = b[0]
    else:
        temp_r = requests.get(url)
        temp_r.encoding = 'utf-8'
        date = re.findall("Reiwa\d{1,2}Année\d{1,2}Mois\d{1,2}journée", temp_r.text)[0]
    date = date.translate(
        str.maketrans({
            "0": "0",
            "1": "1",
            "2": "2",
            "3": "3",
            "4": "4",
            "5": "5",
            "6": "6",
            "7": "7",
            "8": "8",
            "9": "9"
        }))
    date = "".join([(i.zfill(2) if i.isdigit() else i) for i in re.findall(
        "(Reiwa)(\d{1,2})(Année)(\d{1,2})(Mois)(\d{1,2})(journée)", date)[0]])
    if re.findall("Reiwa Mai 2002 0[1-9]journée|Reiwa 2002 0[1-4]Mois\d{1,2}journée", date): continue
    elif date not in dates:
        urls[date] = i["href"]
        dates.append(date)

with open("dates.pickle", "wb") as f:
    pickle.dump(dates, f)

pdfs = {}
for date, url in urls.items():
    temp_r = requests.get(url)
    temp_r.encoding = 'utf-8'
    soup = BeautifulSoup(temp_r.text, 'html.parser')
    for j in soup.find_all('a', href=True):
        if 'Statut des tests préfectoraux positifs' in j.text:
            pdfs[date] = "https://www.mhlw.go.jp" + j['href']


def makeDict(text):
    l = {}
    for i in regex.findall(
            "(\p{Han}(?:\s+\p{Han}|Total){1,2}|(Autre))([※\d\s]+?[\nG])",
            re.sub("※\d{1,2}", "", text).translate(
                str.maketrans({
                    "\u3000": " ",
                    ",": "",
                    "-": "0"
                }))):
        a = list(map(int, i[1].replace("G", "").split()))
        b = "".join(i[0].split())
        l[b] = {}
        l[b]["Nombre de positifs"] = a[0]
        l[b]["Nombre de personnes effectuant des tests PCR"] = a[1]
        l[b]["Ceux qui ont besoin d'un traitement hospitalier, etc."] = a[2]
        l[b]["Sévère"] = a[3]
        l[b]["Nombre de personnes renvoyées ou annulées"] = a[4]
        l[b]["Décès (cumulatif)"] = a[5]
        l[b]["Vérification"] = a[6]
    return l


cnt = 0

if len(pdfs) == 0: pass
elif isGss:
    scope = [
        'https://spreadsheets.google.com/feeds',
        'https://www.googleapis.com/auth/drive'
    ]

    credentials = ServiceAccountCredentials.from_json_keyfile_name('Le nom du fichier json.json', scope) #Le nom du fichier json
    gc = gspread.authorize(credentials)

    SPREADSHEET_KEY = 'Clé de feuille de calcul' #Clé de feuille de calcul

    workbook = gc.open_by_key(SPREADSHEET_KEY)
    try:
        worksheets = [
            workbook.worksheet('Nombre de positifs'),
            workbook.worksheet('Nombre de personnes effectuant des tests PCR'),
            workbook.worksheet('Ceux qui ont besoin d'un traitement hospitalier, etc.'),
            workbook.worksheet('Sévère'),
            workbook.worksheet('Nombre de personnes renvoyées ou annulées'),
            workbook.worksheet('Décès (cumulatif)'),
            workbook.worksheet('Vérification')
        ]
        isFirst = False
    except:
        workbook.add_worksheet(title='Nombre de positifs', rows=100, cols=500)
        workbook.add_worksheet(title='Nombre de personnes effectuant des tests PCR', rows=100, cols=500)
        workbook.add_worksheet(title='Ceux qui ont besoin d'un traitement hospitalier, etc.', rows=100, cols=500)
        workbook.add_worksheet(title='Sévère', rows=100, cols=500)
        workbook.add_worksheet(title='Nombre de personnes renvoyées ou annulées', rows=100, cols=500)
        workbook.add_worksheet(title='Décès (cumulatif)', rows=100, cols=500)
        workbook.add_worksheet(title='Vérification', rows=100, cols=500)
        workbook.del_worksheet(workbook.sheet1)
        worksheets = [
            workbook.worksheet('Nombre de positifs'),
            workbook.worksheet('Nombre de personnes effectuant des tests PCR'),
            workbook.worksheet('Ceux qui ont besoin d'un traitement hospitalier, etc.'),
            workbook.worksheet('Sévère'),
            workbook.worksheet('Nombre de personnes renvoyées ou annulées'),
            workbook.worksheet('Décès (cumulatif)'),
            workbook.worksheet('Vérification')
        ]
        isFirst = True

    cas = [
        worksheet.range(1, column_cnt, 50, column_cnt + len(pdfs) - 1)
        for worksheet in worksheets
    ]
    for date, url in sorted(pdfs.items()):
        print(date)
        file_data = parser.from_buffer(requests.get(url))
        text = file_data["content"]

        l = makeDict(text)
        if isFirst:
            for worksheet in worksheets:
                cells = worksheet.range(2, 1, 50, 1)
                for i, key in enumerate(l.keys()):
                    cells[i].value = key
                worksheet.update_cells(cells)
            isFirst = False
        for i, worksheet in enumerate(worksheets):
            cells = cas[i][cnt::len(pdfs)]
            cells[0].value = date
            for j, a in enumerate(l.keys()):
                key = list(l[a].keys())[i]
                cells[j + 1].value = l[a][key]
        cnt += 1

    for i, worksheet in enumerate(worksheets):
        worksheet.update_cells(cas[i])

else:
    filename = "covid19.xlsx"
    try:
        wb = openpyxl.load_workbook(filename)
        wss = [
            wb.get_sheet_by_name('Nombre de positifs'),
            wb.get_sheet_by_name('Nombre de personnes effectuant des tests PCR'),
            wb.get_sheet_by_name('Ceux qui ont besoin d'un traitement hospitalier, etc.'),
            wb.get_sheet_by_name('Sévère'),
            wb.get_sheet_by_name('Nombre de personnes renvoyées ou annulées'),
            wb.get_sheet_by_name('Décès (cumulatif)'),
            wb.get_sheet_by_name('Vérification')
        ]
        isFirst = False
    except:
        wb = openpyxl.Workbook()
        wss = [
            wb.create_sheet('Nombre de positifs'),
            wb.create_sheet('Nombre de personnes effectuant des tests PCR'),
            wb.create_sheet('Ceux qui ont besoin d'un traitement hospitalier, etc.'),
            wb.create_sheet('Sévère'),
            wb.create_sheet('Nombre de personnes renvoyées ou annulées'),
            wb.create_sheet('Décès (cumulatif)'),
            wb.create_sheet('Vérification')
        ]
        wb.remove(wb.get_sheet_by_name('Sheet'))
        isFirst = True

    for date, url in sorted(pdfs.items()):
        print(date)
        file_data = parser.from_buffer(requests.get(url))
        text = file_data["content"]

        l = makeDict(text)
        if isFirst:
            for ws in wss:
                for i, key in enumerate(l.keys()):
                    ws.cell(i + 2, 1, key)
            isFirst = False
        for i, ws in enumerate(wss):
            ws.cell(1, column_cnt + cnt, date)
            for j, a in enumerate(l.keys()):
                key = list(l[a].keys())[i]
                ws.cell(j + 2, column_cnt + cnt, l[a][key])
        cnt += 1

    wb.save(filename)

Comment utiliser

Enregistrez et exécutez simplement à partir de Python. Un dates.pickle sera généré pour sauvegarder les dates enregistrées, veuillez ne pas le déplacer du même répertoire que le fichier exécutable.

résultat

image.png

Vous pouvez facilement visualiser les changements dans le nombre de personnes infectées. image.png

Résumé

En regardant l'évolution du nombre de personnes infectées dans tout le pays, je me demande si la deuxième vague s'installe ...? Si vous souhaitez observer la transition d'infection en détail ou si vous souhaitez effectuer un traitement statistique, veuillez l'essayer. Il semble qu'il puisse être mis à jour automatiquement s'il est exécuté régulièrement à l'aide du planificateur de tâches ou GCF.

Recommended Posts

[Python] Lisez automatiquement les informations par préfecture du nouveau virus corona du PDF du ministère de la Santé, du Travail et du Bien-être social et écrivez-les dans un tableur ou Excel.
Data Langling PDF sur l'épidémie de grippe par le ministère de la Santé, du Travail et du Bien-être social
Scraping PDF de la liste nationale des salaires minimums par région du ministère de la Santé, du Travail et du Bien-être social
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
Nettoyage des données des données ouvertes de la situation d'occurrence du ministère de la Santé, du Travail et des Affaires sociales
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
Data wrangling (pdfplumber) PDF sur l'épidémie de grippe par le ministère de la Santé, du Travail et du Bien-être social
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
[Selenium] Ouvrez le lien dans un nouvel onglet et déplacez-le [Pilote Python / Chrome]
Lisez le fichier csv avec le notebook jupyter et écrivez le graphique l'un sur l'autre
Ecrire un histogramme à l'échelle logarithmique sur l'axe des x en python
Mettez Ubuntu dans Raspi, mettez Docker dessus et contrôlez GPIO avec python à partir du conteneur
Jetons un coup d'œil à la tendance infectieuse du nouveau coronavirus COVID-19 dans chaque pays et à l'état de la réponse médicale (informations supplémentaires).
[Python] Le statut de chaque préfecture du nouveau virus corona n'est publié qu'en PDF, mais j'ai essayé de le gratter sans le télécharger.
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Lisez le fichier en Python avec un chemin relatif depuis le programme
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Configurer un serveur SMTP factice avec Python et vérifier le fonctionnement de l'envoi depuis Action Mailer
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Scraping PDF de la liste nationale des salaires minimums par région du ministère de la Santé, du Travail et du Bien-être social
Data Langling PDF sur l'épidémie de grippe par le ministère de la Santé, du Travail et du Bien-être social
Nettoyage des données des données ouvertes de la situation d'occurrence du ministère de la Santé, du Travail et des Affaires sociales
Data wrangling (pdfplumber) PDF sur l'épidémie de grippe par le ministère de la Santé, du Travail et du Bien-être social
[Python] Lisez automatiquement les informations par préfecture du nouveau virus corona du PDF du ministère de la Santé, du Travail et du Bien-être social et écrivez-les dans un tableur ou Excel.
Scraping Go To EAT membres magasins dans la préfecture d'Osaka et conversion au format CSV
[Python] Le statut de chaque préfecture du nouveau virus corona n'est publié qu'en PDF, mais j'ai essayé de le gratter sans le télécharger.
Gratter la liste des magasins membres Go To EAT dans la préfecture de Fukuoka et la convertir en CSV
Gratter la liste des magasins membres Go To EAT dans la préfecture de Niigata et la convertir en CSV
Racler le calendrier de Hinatazaka 46 et le refléter dans Google Agenda
[Python] Créez un script qui utilise FeedParser et LINE Notify pour informer LINE des dernières informations sur le nouveau virus corona du ministère de la Santé, du Travail et des Affaires sociales.
Statut de chaque système de traitement Python en 2020
Faites correspondre la distribution de chaque groupe en Python
Visualisation de l'état d'utilisation de l'évier dans l'entreprise
Vérifiez le temps de traitement et le nombre d'appels pour chaque processus avec python (cProfile)