気象庁のアメダス(AMeDAS)情報のスクレイピングは、絞ってやると良いようだ 

先日、気象庁のアメダス(AMeDAS)の情報をスクレイピングして、Twitterに吐くbotを作りました。

気象庁の発表している気象データをTwitterに吐き出すようにしてみた(怒られないように?) – happyman web

1.スクレイピングしていたデータを少し考える。

このスクレイピングのコードは、気象庁のデータの頭3つを取り込むというもので、速報の日にち、時間、気温を抽出するにはそれで問題がありません。

# 先頭のデータを変数に格納し空のセルを除去
output_data = []
for item in cell_data:
  if item.text:
  output_data.append(item.text)
    if len(output_data) >= 3:
     break

肝の部分は、ここでありあまり良く理解できていないのですが、読み出しの1個目のデータは削除して、使うデータを読みだしてやっています。

日付がday=output_data[0], 時間がtime=output_data[1], 温度がtemp=output_data[2]として吸い出しています。

これが順番になっています。

2.もう1時間前のデータも参照したくなった。

この構造からみれば、1時間前のデータは数を増やせば良いようだ。

https://www.jma.go.jp/bosai/amedas/#amdno=51106&area_type=offices&area_code=230000&format=table1h&elems=53414

2段目は、時間がoutput_data[9]、気温がoutput_data[10]になるみたい。

if len(output_data) >= 3:の数字の部分は読み込みたい部分まで変更する必要がある。

ただ問題が発生した。

夜の間は日照時間のところがブランクになっていて、そこがデータを飛ばしているようなのだ。

これでは色々コードを昼と夜で書き換えないといけない。

3.気象庁の表示するデータを絞ってやれば良いらしい

もともとWebに表示されたデータをスクレイピングしているわけだから、Webに表示されるデータを絞ればいいようです。

https://www.jma.go.jp/bosai/amedas/#amdno=51106&area_type=offices&area_code=230000&format=table1h&elems=40000

このように表示を削ると余計なデータを拾ってこないので、1時間前の時間がoutput_data[3]、気温がoutput_data[4]となります。

コードにしてみた。

from requests_html import HTMLSession

# 観測データのアドレス(例:名古屋)
url = "https://www.jma.go.jp/bosai/amedas/#amdno=51106&area_type=offices&area_code=230000&format=table1h&elems=40000"

# GETメソッドでリクエストを送信
session = HTMLSession()
r = session.get(url)
# ブラウザエンジンでHTMLをレンダリング
# 表の描画に若干時間がかかるためsleepで待機時間を設定
r.html.render(sleep=3)

# データを抽出
cell_data = r.html.find("table.amd-table-seriestable td")

# 先頭のデータを変数に格納し空のセルを除去
output_data = []
for item in cell_data:
  if item.text:
  output_data.append(item.text)
   if len(output_data) >= 5:
    break

tempr = ('気象庁によると名古屋{day} {time} の気温は{temp}℃です。 \
   {time2} の気温は{temp2}℃でした。' \
   .format(day=output_data[0], time=output_data[1], temp=output_data[2], \
   time2=output_data[3], temp2=output_data[4]))
print(tempr)

こんな感じで、コマンドでコードを動かすと。

このように1時間前の気温も簡単に吐き出すようになりました。

(ただし日付を跨いだものはダメだと言うことにあとで気がついた。まだ未解決である。)