code4nagoya / covid19-aichi-tools

MIT License
6 stars 5 forks source link

愛知県HPからスクレイピングで取得する「発生事例のPDF」のファイル名を固定化する #89

Open amay077 opened 3 years ago

amay077 commented 3 years ago

「愛知県内の発生事例」のPDFは、 https://www.pref.aichi.jp/site/covid19-aichi/ をスクレイピングしてダウンロードしているが、そのファイル名はランダム(日ごとに変わる)模様。

PDF は data.json のソースデータとして、 https://github.com/code4nagoya/covid19/tree/development/data へコミットしているが、ファイル名が変わるために、このディレクトリ内の PDF が増えていくのが問題。 ダウンロードするPDFは 2つ のみ(当月 と 先月まで)なので 2ファイルしか存在しないのが望ましい。

image

m/code4nagoya/covid19-aichi-tools/pull/86 の修正により発生した可能性が高く、それ以前は、ファイル名は source1.pdf, source2.pdfsourceN.pdf で固定されていた。

以前のように source1.pdf, source2.pdf でもよいし、 YYYYMM.pdf の形式にしてもよい。

imabari commented 3 years ago

ファイル保存部分をファイル名に変更

def fetch_file(url, pdf_path):

    r = requests.get(url)
    r.raise_for_status()

    p = pathlib.Path(pdf_path)
    p.parent.mkdir(parents=True, exist_ok=True)

    with p.open(mode="wb") as fw:
        fw.write(r.content)
    return p

スクレイピング部分を変更

dfs = []

tags = soup.find("span", text="▶ 愛知県内の発生事例").parent.find_all("a", href=re.compile(".pdf$"))[::-1]

for i, tag in enumerate(tags, 1):

    link = urljoin(url, tag.get("href"))

    path_pdf = fetch_file(link, f"./data/source{i}.pdf")

    with pdfplumber.open(path_pdf) as pdf:

        for page in pdf.pages:

            table = page.extract_table()

            df_tmp = pd.DataFrame(table[1:], columns=table[0])

            dfs.append(df_tmp)