WHO の Coronavirus disease (COVID-2019) situation reportsのPDFから最新の感染者数を取得2

Pythonだけで作成できるように変更

インストール

pip install pdfminer.six
pip install requests
pip install beautifulsoup4

プログラム

import datetime
import os
import re
import urllib.parse

import requests
from bs4 import BeautifulSoup
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBoxHorizontal
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage

# テキスト抽出
def get_text(url):

    # ファイル名作成
    filename = os.path.basename(url)

    if not os.path.exists(filename):

        # ダウンロード
        r = requests.get(url)

        r.raise_for_status()

        # ファイル保存
        with open(filename, "wb") as fw:
            fw.write(r.content)

    if os.path.exists(filename):

        # テキスト範囲
        x_min, x_max = 420, 575
        y_min, y_max = 400, 700

        resourceManager = PDFResourceManager()
        device = PDFPageAggregator(resourceManager, laparams=LAParams())

        tmp = []

        with open(filename, "rb") as fp:

            interpreter = PDFPageInterpreter(resourceManager, device)

            for page in PDFPage.get_pages(fp, maxpages=1):

                interpreter.process_page(page)

                layout = device.get_result()

                for l in layout:

                    if isinstance(l, LTTextBoxHorizontal):

                        # 範囲のテキスト抽出
                        if x_min < l.x0 < l.x1 < x_max:
                            if y_min < l.y0 < l.y1 < y_max:
                                tmp.append(l.get_text().strip())

        device.close()

        # テキスト結合
        result = "\n".join(tmp) if tmp else ""

        print(result)

        return result

    else:
        print(f"{filename}が見つかりません")
        return ""


# クエリーの除去
def remove_all_query(url):
    return urllib.parse.urlunparse(urllib.parse.urlparse(url)._replace(query=None))


# スクレイピング
if __name__ == "__main__":

    url = "https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports/"

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
    }

    r = requests.get(url, headers=headers)

    r.raise_for_status()

    soup = BeautifulSoup(r.content, "html.parser")

    # レポートのタグ取得
    href = soup.find(string=re.compile(r"^Situation report - \d{1,2}")).find_parent("a")

    # レポートのPDFのリンクからクエリーを除去
    link = remove_all_query(urllib.parse.urljoin(url, href.get("href")))

    # レポートの日付を取得
    dt = datetime.datetime.strptime(href.find_parent("p").contents[-1], "%d %B %Y")

    text = get_text(link)

    if text:

        # 感染者数を取得
        conf = [
            int(i[0].replace(" ", "") if i[0] else 0)
            for i in re.findall("([0-9 ]+) (laboratory-)?confirmed", text)
        ]

        # 死亡者数を取得
        deaths = [
            int(i.replace(" ", "") if i else 0)
            for i in re.findall("([0-9 ]+) death", text)
        ]
        deaths.extend([0])

        result = [
            dt.strftime("%Y-%m-%d"),
            conf[0],
            deaths[0] + deaths[1],
            conf[1],
            deaths[0],
        ]

        print(result)

    else:
        print("テキストがありません")