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

imabari.hateblo.jp

Pythonだけで抽出できるように変更しました

参考

oku.edu.mie-u.ac.jp

  • 一番上の最新のPDFをダウンロード
  • 8週目以降の1ページ右上部分から取得(座標指定)
  • Colaboratory上で実行
  • 2/13だけChinaのdeathsが取れない ※Colaboratory以外では正常に抽出できました
tool Colaboratory Windows10
pdftotext ×
pdfbox ×
tika ×
pdfminer ×

プログラム

2/20 タグが変更になり日付のところでエラーが発生しましたので修正しました

!apt install poppler-utils

import requests
from bs4 import BeautifulSoup

import urllib.parse
import re

import datetime

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

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("^Situation report - \d{1,2}")).find_parent("a")

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

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

# レポートのPDFをダウンロード
!wget $link -O data.pdf

# PDFからテキスト取得
!pdftotext  -f 1 -l 1 -layout -x 405 -y 80 -W 180 -H 370 data.pdf

with open("data.txt") as fr:
    text = fr.read()

# テキスト確認
print(text)

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

deaths = [int(i.replace(" ", "")) 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)