[GO] [Python] Lesen Sie automatisch Informationen der Präfektur des neuen Koronavirus aus dem PDF des Ministeriums für Gesundheit, Arbeit und Soziales und schreiben Sie sie in eine Tabelle oder in Excel.

Einführung

Informationen zum neuen Koronavirus, die täglich aktualisiert werden, werden auf der Website des Ministeriums für Gesundheit, Arbeit und Soziales veröffentlicht. Pressemitteilung zu neuer Coronavirus-Infektion (Ausbruchsituation, Ausbruch von Hauspatienten, Situation in Übersee usw.) Von dort aus habe ich ein Programm erstellt, das detaillierte Daten nach Präfektur sammelt (obwohl es sich nur um Daten nach 5/10 mit demselben PDF-Format handelt) und diese in Google SpreadSheet oder Excel aufzeichnet. Daher möchte ich sie vorstellen.

Da es in der Tabellenberechnungssoftware aufgezeichnet ist, können Sie die Änderungen in der Anzahl der infizierten Personen und der Schweregradrate usw. leicht aus der Vogelperspektive betrachten.

Vorbereitung

Wenn Sie es in Excel verwenden, können Sie es so verwenden, wie es ist, aber Sie müssen ein wenig vorbereiten, um von einem Python-Programm aus auf Google SpreadSheet zuzugreifen. Bitte besuchen Sie die folgende Site usw., treffen Sie Vorbereitungen und geben Sie den Namen der JSON-Datei und den Tabellenkalkulationsschlüssel in den Kommentarteil (um Zeile 105) des Programms ein. [Zögern Sie nicht länger] Zusammenfassung der Grundeinstellungen zum Lesen und Schreiben in Tabellenkalkulationen mit Python Google-Tabelle in Python bearbeiten

Programm

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 "Über die aktuelle Situation einer neuen Coronavirus-Infektion und die Reaktion des Ministeriums für Gesundheit, Arbeit und Soziales" not in i.text: continue
    b = re.findall("Reiwa\d{1,2}Jahr\d{1,2}Mond\d{1,2}Tag", 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}Jahr\d{1,2}Mond\d{1,2}Tag", 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})(Jahr)(\d{1,2})(Mond)(\d{1,2})(Tag)", date)[0]])
    if re.findall("Reiwa Mai 2002 0[1-9]Tag|Reiwa 2002 0[1-4]Mond\d{1,2}Tag", 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 'Status der positiven Präfekturtests' 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}|Gesamt){1,2}|(Andere))([※\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]["Anzahl der Positiven"] = a[0]
        l[b]["Anzahl der Personen, die PCR-Tests durchführen"] = a[1]
        l[b]["Diejenigen, die eine Krankenhausbehandlung usw. benötigen"] = a[2]
        l[b]["Stark"] = a[3]
        l[b]["Anzahl der entlassenen oder stornierten Personen"] = a[4]
        l[b]["Tod (kumulativ)"] = a[5]
        l[b]["Überprüfung"] = 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('Der Name der JSON-Datei.json', scope) #Der Name der JSON-Datei
    gc = gspread.authorize(credentials)

    SPREADSHEET_KEY = 'Tabellenkalkulationsschlüssel' #Tabellenkalkulationsschlüssel

    workbook = gc.open_by_key(SPREADSHEET_KEY)
    try:
        worksheets = [
            workbook.worksheet('Anzahl der Positiven'),
            workbook.worksheet('Anzahl der Personen, die PCR-Tests durchführen'),
            workbook.worksheet('Diejenigen, die eine Krankenhausbehandlung usw. benötigen'),
            workbook.worksheet('Stark'),
            workbook.worksheet('Anzahl der entlassenen oder stornierten Personen'),
            workbook.worksheet('Tod (kumulativ)'),
            workbook.worksheet('Überprüfung')
        ]
        isFirst = False
    except:
        workbook.add_worksheet(title='Anzahl der Positiven', rows=100, cols=500)
        workbook.add_worksheet(title='Anzahl der Personen, die PCR-Tests durchführen', rows=100, cols=500)
        workbook.add_worksheet(title='Diejenigen, die eine Krankenhausbehandlung usw. benötigen', rows=100, cols=500)
        workbook.add_worksheet(title='Stark', rows=100, cols=500)
        workbook.add_worksheet(title='Anzahl der entlassenen oder stornierten Personen', rows=100, cols=500)
        workbook.add_worksheet(title='Tod (kumulativ)', rows=100, cols=500)
        workbook.add_worksheet(title='Überprüfung', rows=100, cols=500)
        workbook.del_worksheet(workbook.sheet1)
        worksheets = [
            workbook.worksheet('Anzahl der Positiven'),
            workbook.worksheet('Anzahl der Personen, die PCR-Tests durchführen'),
            workbook.worksheet('Diejenigen, die eine Krankenhausbehandlung usw. benötigen'),
            workbook.worksheet('Stark'),
            workbook.worksheet('Anzahl der entlassenen oder stornierten Personen'),
            workbook.worksheet('Tod (kumulativ)'),
            workbook.worksheet('Überprüfung')
        ]
        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('Anzahl der Positiven'),
            wb.get_sheet_by_name('Anzahl der Personen, die PCR-Tests durchführen'),
            wb.get_sheet_by_name('Diejenigen, die eine Krankenhausbehandlung usw. benötigen'),
            wb.get_sheet_by_name('Stark'),
            wb.get_sheet_by_name('Anzahl der entlassenen oder stornierten Personen'),
            wb.get_sheet_by_name('Tod (kumulativ)'),
            wb.get_sheet_by_name('Überprüfung')
        ]
        isFirst = False
    except:
        wb = openpyxl.Workbook()
        wss = [
            wb.create_sheet('Anzahl der Positiven'),
            wb.create_sheet('Anzahl der Personen, die PCR-Tests durchführen'),
            wb.create_sheet('Diejenigen, die eine Krankenhausbehandlung usw. benötigen'),
            wb.create_sheet('Stark'),
            wb.create_sheet('Anzahl der entlassenen oder stornierten Personen'),
            wb.create_sheet('Tod (kumulativ)'),
            wb.create_sheet('Überprüfung')
        ]
        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)

Wie benutzt man

Speichern Sie einfach und führen Sie Python aus. Zum Speichern der aufgezeichneten Daten wird ein date.pickle generiert. Verschieben Sie es bitte nicht aus demselben Verzeichnis wie die ausführbare Datei.

Ergebnis

image.png

Sie können Änderungen in der Anzahl der infizierten Personen leicht visualisieren. image.png

Zusammenfassung

Angesichts der Veränderungen in der Zahl der Infizierten im ganzen Land frage ich mich, ob sich die zweite Welle beruhigt ...? Wenn Sie den Infektionsübergang detailliert beobachten oder eine statistische Verarbeitung durchführen möchten, versuchen Sie es bitte. Es scheint, dass es automatisch aktualisiert werden kann, wenn es regelmäßig mit dem Taskplaner oder GCF ausgeführt wird.

Recommended Posts

[Python] Lesen Sie automatisch Informationen der Präfektur des neuen Koronavirus aus dem PDF des Ministeriums für Gesundheit, Arbeit und Soziales und schreiben Sie sie in eine Tabelle oder in Excel.
Daten Langling PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
PDF-Datei mit der nationalen Liste der Mindestlöhne nach Regionen des Ministeriums für Gesundheit, Arbeit und Soziales
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
[Python / Jupyter] Übersetzen Sie den Kommentar des in die Zwischenablage kopierten Programms und fügen Sie ihn in eine neue Zelle ein.
Datenbereinigung offener Daten zur Ereignissituation des Ministeriums für Gesundheit, Arbeit und Soziales
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
Data Langling (pdfplumber) PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe
[Selen] Öffnen Sie den Link in einem neuen Tab und verschieben Sie ihn [Python / Chrome-Treiber]
Lesen Sie die CSV-Datei mit dem Jupiter-Notizbuch und schreiben Sie die Grafik übereinander
Schreiben Sie in Python ein logarithmisches Histogramm auf die x-Achse
Setzen Sie Ubuntu in Raspi ein, setzen Sie Docker darauf und steuern Sie GPIO mit Python aus dem Container
Werfen wir einen Blick auf die Infektionstendenz des neuen Coronavirus COVID-19 in jedem Land und den Status der medizinischen Reaktion (zusätzliche Informationen).
[Python] Der Status jeder Präfektur des neuen Koronavirus wird nur als PDF veröffentlicht, aber ich habe versucht, ihn zu kratzen, ohne ihn herunterzuladen.
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Lesen Sie die Datei in Python mit einem relativen Pfad aus dem Programm
Holen Sie sich die Anzahl der Leser von Artikeln über Mendeley in Python
Richten Sie mit Python einen Dummy-SMTP-Server ein und überprüfen Sie den Sendevorgang von Action Mailer
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
PDF-Datei mit der nationalen Liste der Mindestlöhne nach Regionen des Ministeriums für Gesundheit, Arbeit und Soziales
Daten Langling PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
Datenbereinigung offener Daten zur Ereignissituation des Ministeriums für Gesundheit, Arbeit und Soziales
Data Langling (pdfplumber) PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
[Python] Lesen Sie automatisch Informationen der Präfektur des neuen Koronavirus aus dem PDF des Ministeriums für Gesundheit, Arbeit und Soziales und schreiben Sie sie in eine Tabelle oder in Excel.
Scraping Gehen Sie zu EAT-Mitgliedsgeschäften in der Präfektur Osaka und konvertieren Sie zu CSV
[Python] Der Status jeder Präfektur des neuen Koronavirus wird nur als PDF veröffentlicht, aber ich habe versucht, ihn zu kratzen, ohne ihn herunterzuladen.
Verschrotten Sie die Liste der Go To EAT-Mitgliedsgeschäfte in der Präfektur Fukuoka und konvertieren Sie sie in CSV
Verschrotten Sie die Liste der Go To EAT-Mitgliedsspeicher in der Präfektur Niigata und konvertieren Sie sie in CSV
Verschrotten Sie den Zeitplan von Hinatazaka 46 und spiegeln Sie ihn in Google Kalender wider
[Python] Erstellen Sie ein Skript, das FeedParser und LINE Notify verwendet, um LINE über die neuesten Informationen zum neuen Koronavirus des Ministeriums für Gesundheit, Arbeit und Soziales zu informieren.
Status jedes Python-Verarbeitungssystems im Jahr 2020
Passen Sie die Verteilung jeder Gruppe in Python an
Visualisierte den Nutzungsstatus der Spüle im Unternehmen
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).