気象庁のアメダス(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時間前のデータは数を増やせば良いようだ。
2段目は、時間がoutput_data[9]、気温がoutput_data[10]になるみたい。
if len(output_data) >= 3:の数字の部分は読み込みたい部分まで変更する必要がある。
ただ問題が発生した。
夜の間は日照時間のところがブランクになっていて、そこがデータを飛ばしているようなのだ。
これでは色々コードを昼と夜で書き換えないといけない。
3.気象庁の表示するデータを絞ってやれば良いらしい
もともとWebに表示されたデータをスクレイピングしているわけだから、Webに表示されるデータを絞ればいいようです。
このように表示を削ると余計なデータを拾ってこないので、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時間前の気温も簡単に吐き出すようになりました。
(ただし日付を跨いだものはダメだと言うことにあとで気がついた。まだ未解決である。)
ディスカッション
コメント一覧
まだ、コメントがありません