愛知県の市町村別人口データのjson作成

import datetime
import re
from urllib.parse import urljoin

import pandas as pd
import requests
from bs4 import BeautifulSoup

url = "https://www.pref.aichi.jp/toukei/"

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


def get_link(url, text):

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

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

    tag = soup.find("a", text=text)

    return tag


JST = datetime.timezone(datetime.timedelta(hours=+9), "JST")
dt_now = datetime.datetime.now(JST)

link = get_link(url, "あいちの人口").get("href")

tag = get_link(link, re.compile("現在人口"))

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

m = re.match("(\d{4})年(\d{1,2})月(\d{1,2})日", tag.get_text())

if m:
    year, month, day = map(int, m.groups())
    dt_now = datetime.datetime(year, month, day)

dt_now


df = pd.read_csv(csv_url, index_col="県市町村").dropna(how="all")

df_city = (
    df[df["性別"] == "男女"]
    .loc[:, ["コード", "総数"]]
    .rename(columns={"コード": "市町村コード", "総数": "人口"})
)

df_city["市町村名"] = df_city.index.str.rstrip("県市町村")

city_data = df_city.to_dict(orient="index")

data = {"lastUpdateAt": dt_now.isoformat(), "data": city_data}

import json

with open("city_data.json", "w", encoding="utf-8") as fw:
    json.dump(data, fw, ensure_ascii=False, indent=4)
{
    "lastUpdateAt": "2020-11-01T00:00:00",
    "data": {
        "愛知県": {
            "市町村コード": 23000,
            "人口": 7538701,
            "市町村名": "愛知"
        },
        "名古屋市": {
            "市町村コード": 23100,
            "人口": 2327689,
            "市町村名": "名古屋"
        },
        "豊橋市": {
            "市町村コード": 23201,
            "人口": 371856,
            "市町村名": "豊橋"
        },
        "岡崎市": {
            "市町村コード": 23202,
            "人口": 385371,
            "市町村名": "岡崎"
        },
        "一宮市": {
            "市町村コード": 23203,
            "人口": 378768,
            "市町村名": "一宮"
        },
        "瀬戸市": {
            "市町村コード": 23204,
            "人口": 127265,
            "市町村名": "瀬戸"
        },
        "半田市": {
            "市町村コード": 23205,
            "人口": 117742,
            "市町村名": "半田"
        },
        "春日井市": {
            "市町村コード": 23206,
            "人口": 306538,
            "市町村名": "春日井"
        },
        "豊川市": {
            "市町村コード": 23207,
            "人口": 183958,
            "市町村名": "豊川"
        },
        "津島市": {
            "市町村コード": 23208,
            "人口": 61030,
            "市町村名": "津島"
        },
        "碧南市": {
            "市町村コード": 23209,
            "人口": 72601,
            "市町村名": "碧南"
        },
        "刈谷市": {
            "市町村コード": 23210,
            "人口": 153481,
            "市町村名": "刈谷"
        },
        "豊田市": {
            "市町村コード": 23211,
            "人口": 422878,
            "市町村名": "豊田"
        },
        "安城市": {
            "市町村コード": 23212,
            "人口": 188705,
            "市町村名": "安城"
        },
        "西尾市": {
            "市町村コード": 23213,
            "人口": 169017,
            "市町村名": "西尾"
        },
        "蒲郡市": {
            "市町村コード": 23214,
            "人口": 79419,
            "市町村名": "蒲郡"
        },
        "犬山市": {
            "市町村コード": 23215,
            "人口": 72926,
            "市町村名": "犬山"
        },
        "常滑市": {
            "市町村コード": 23216,
            "人口": 57689,
            "市町村名": "常滑"
        },
        "江南市": {
            "市町村コード": 23217,
            "人口": 97541,
            "市町村名": "江南"
        },
        "小牧市": {
            "市町村コード": 23219,
            "人口": 148128,
            "市町村名": "小牧"
        },
        "稲沢市": {
            "市町村コード": 23220,
            "人口": 134893,
            "市町村名": "稲沢"
        },
        "新城市": {
            "市町村コード": 23221,
            "人口": 43778,
            "市町村名": "新城"
        },
        "東海市": {
            "市町村コード": 23222,
            "人口": 113284,
            "市町村名": "東海"
        },
        "大府市": {
            "市町村コード": 23223,
            "人口": 92418,
            "市町村名": "大府"
        },
        "知多市": {
            "市町村コード": 23224,
            "人口": 84059,
            "市町村名": "知多"
        },
        "知立市": {
            "市町村コード": 23225,
            "人口": 71868,
            "市町村名": "知立"
        },
        "尾張旭市": {
            "市町村コード": 23226,
            "人口": 82176,
            "市町村名": "尾張旭"
        },
        "高浜市": {
            "市町村コード": 23227,
            "人口": 48765,
            "市町村名": "高浜"
        },
        "岩倉市": {
            "市町村コード": 23228,
            "人口": 47941,
            "市町村名": "岩倉"
        },
        "豊明市": {
            "市町村コード": 23229,
            "人口": 69381,
            "市町村名": "豊明"
        },
        "日進市": {
            "市町村コード": 23230,
            "人口": 92713,
            "市町村名": "日進"
        },
        "田原市": {
            "市町村コード": 23231,
            "人口": 59148,
            "市町村名": "田原"
        },
        "愛西市": {
            "市町村コード": 23232,
            "人口": 61000,
            "市町村名": "愛西"
        },
        "清須市": {
            "市町村コード": 23233,
            "人口": 69771,
            "市町村名": "清須"
        },
        "北名古屋市": {
            "市町村コード": 23234,
            "人口": 86101,
            "市町村名": "北名古屋"
        },
        "弥富市": {
            "市町村コード": 23235,
            "人口": 43083,
            "市町村名": "弥富"
        },
        "みよし市": {
            "市町村コード": 23236,
            "人口": 62919,
            "市町村名": "みよし"
        },
        "あま市": {
            "市町村コード": 23237,
            "人口": 87616,
            "市町村名": "あま"
        },
        "長久手市": {
            "市町村コード": 23238,
            "人口": 62414,
            "市町村名": "長久手"
        },
        "東郷町": {
            "市町村コード": 23302,
            "人口": 44093,
            "市町村名": "東郷"
        },
        "豊山町": {
            "市町村コード": 23342,
            "人口": 15708,
            "市町村名": "豊山"
        },
        "大口町": {
            "市町村コード": 23361,
            "人口": 24248,
            "市町村名": "大口"
        },
        "扶桑町": {
            "市町村コード": 23362,
            "人口": 34260,
            "市町村名": "扶桑"
        },
        "大治町": {
            "市町村コード": 23424,
            "人口": 32550,
            "市町村名": "大治"
        },
        "蟹江町": {
            "市町村コード": 23425,
            "人口": 36827,
            "市町村名": "蟹江"
        },
        "飛島村": {
            "市町村コード": 23427,
            "人口": 4604,
            "市町村名": "飛島"
        },
        "阿久比町": {
            "市町村コード": 23441,
            "人口": 28182,
            "市町村名": "阿久比"
        },
        "東浦町": {
            "市町村コード": 23442,
            "人口": 49156,
            "市町村名": "東浦"
        },
        "南知多町": {
            "市町村コード": 23445,
            "人口": 16788,
            "市町村名": "南知多"
        },
        "美浜町": {
            "市町村コード": 23446,
            "人口": 22490,
            "市町村名": "美浜"
        },
        "武豊町": {
            "市町村コード": 23447,
            "人口": 43115,
            "市町村名": "武豊"
        },
        "幸田町": {
            "市町村コード": 23501,
            "人口": 42409,
            "市町村名": "幸田"
        },
        "設楽町": {
            "市町村コード": 23561,
            "人口": 4408,
            "市町村名": "設楽"
        },
        "東栄町": {
            "市町村コード": 23562,
            "人口": 2937,
            "市町村名": "東栄"
        },
        "豊根村": {
            "市町村コード": 23563,
            "人口": 996,
            "市町村名": "豊根"
        }
    }
}