インストール
pip install pandas
pip install requests
pip install tweepy
プログラム
import csv
import datetime
import pathlib
import urllib.parse
import pandas as pd
import requests
import tweepy
consumer_key = ""
consumer_secret = ""
access_token = ""
access_token_secret = ""
d = {
"ST": 1,
"DA": 1,
"SC": 1,
"DC": 1,
"OF": 1,
"OW": "FB_H",
"IT": "E",
"NA": "楽天モバイル",
}
parm = urllib.parse.urlencode(d, encoding="shift-jis")
r = requests.get("https://www.tele.soumu.go.jp/musen/list", parm)
r.raise_for_status()
cr = csv.reader(r.text.splitlines(), delimiter=",")
data = list(cr)
df0 = pd.DataFrame(data[1:]).dropna(how="all")
update = datetime.datetime.strptime(data[0][0], "%Y-%m-%d").date()
len(df0) == int(data[0][1])
df1 = df0[25].str.strip().str.split(r"\\n", 2, expand=True)
se = df1.loc[df1[0].str.contains("携帯電話(その他基地局等"), 2]
df2 = (
se.str.strip()
.str.replace(r"\\n", "")
.str.extractall("(.+?)\(([0-9,]+?)\)")
.rename(columns={0: "市区町村名", 1: "開設局数"})
.reset_index(drop=True)
)
df2["市区町村名"] = df2["市区町村名"].str.strip()
df2["開設局数"] = df2["開設局数"].str.strip().str.replace(",", "").astype(int)
flag = df2["市区町村名"].str.endswith(("都", "道", "府", "県"))
df2["都道府県名"] = df2["市区町村名"].where(flag).fillna(method="ffill")
df2
df_prefs = df2[flag].reset_index(drop=True)
df_prefs
df_prefs.to_csv("prefs.csv", encoding="utf_8_sig")
df_cities = (
df2[~flag].reset_index(drop=True).reindex(columns=["都道府県名", "市区町村名", "開設局数"])
)
df_cities
df_cities.to_csv("cities.csv", encoding="utf_8_sig")
df_nara = df_cities[df_cities["都道府県名"] == "奈良県"].copy()
df_nara["市区町村名"] = df_nara["市区町村名"].str.replace(
"^(添上郡|山辺郡|生駒郡|磯城郡|宇陀郡|高市郡|北葛城郡|吉野郡)", "", regex=True
)
df_nara.set_index("市区町村名", inplace=True)
df_nara.drop("都道府県名", axis=1, inplace=True)
idx = (
"奈良市",
"大和高田市",
"大和郡山市",
"天理市",
"橿原市",
"桜井市",
"五條市",
"御所市",
"生駒市",
"香芝市",
"葛城市",
"宇陀市",
"山添村",
"平群町",
"三郷町",
"斑鳩町",
"安堵町",
"川西町",
"三宅町",
"田原本町",
"曽爾村",
"御杖村",
"高取町",
"明日香村",
"上牧町",
"王寺町",
"広陵町",
"河合町",
"吉野町",
"大淀町",
"下市町",
"黒滝村",
"天川村",
"野迫川村",
"十津川村",
"下北山村",
"上北山村",
"川上村",
"東吉野村",
)
df_nara = df_nara.reindex(idx, fill_value=0)
df_nara["開設局数"].sum()
df_nara.loc["計"] = df_nara["開設局数"].sum()
print(update.isoformat())
dt_3d = datetime.date.today() - datetime.timedelta(days=3)
if update > dt_3d:
print("3日以内に更新されました")
p = pathlib.Path("latest.csv")
df_nara.rename(columns={"開設局数": update.isoformat()}, inplace=True)
if p.exists():
print("latest.csvを更新します")
df_last = pd.read_csv(p, index_col=0)
dt_last = datetime.date.fromisoformat(df_last.columns[0])
if update > dt_last:
print("データがアップデートされました")
df_last.to_csv(f"{df_last.columns[0]}.csv", encoding="utf_8_sig")
df_diff = df_last.join(df_nara)
df_diff["差分"] = df_diff.diff(axis=1).iloc[:, -1].astype(int)
df_diff.to_csv("diff.csv", encoding="utf_8_sig")
df3 = df_diff[df_diff["差分"] != 0]
mes = []
mes.append("総務省免状更新 #楽天モバイル #奈良県")
mes.append("https://www.tele.soumu.go.jp/musen/SearchServlet?pageID=4&IT=E&DFCD=0001745556&DD=2&styleNumber=00")
mes.append("https://docs.google.com/spreadsheets/d/1HojKLdBi3DP_qP6_y0gHEYCztmwazzWDc1iDng-nmtU/edit?usp=sharing\n")
for i, row in df3.iterrows():
mes.append(f"{i} {row[1]}({row[2]:+})")
twit = "\n".join(mes)
print(twit)
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
api.update_status(twit)
else:
print("latest.csvを作成しました")
df_nara.to_csv("latest.csv", encoding="utf_8_sig")