METARやTAFをスクレイピングを使って自動取得

概要
--
日本全国の空港はMETARというものを発出しています。

METARを知らない方は[こちら](https://www.skytrophy.com/metar-main/)！

まあ、これを読んでいる人はほとんどの方はMETARが何かを知っていると思います。

今回は、METARを自動取得し、Twitterに自動投稿する方法を解説したいと思います。

構成
--
プログラミング言語:python

サーバー:conoha wing

サーバーに関しては、30分に一回自動でTwitterに投稿するために私は使っています。

もともと、このサイトを運営するために用いているので、せっかくならという感じです。

実際のプログラム
--------

### ライブラリと変数

        import urllib.request
        airport = ["RJCC","RJAA","RJTT","RJGG","RJOO","RJBB","RJFF","ROAH"]
        URL_start = "http://tgftp.nws.noaa.gov/data/observations/metar/stations/"
        URL_end = ".TXT"

まず、一行目はURLの内容を取得するためのライブラリです。

二行目はMETARを取得したい空港一覧です。私の場合は、大きい空港だけが欲しかったので、このようになっています。他の空港が取得したい場合には　"空港名"　を追加してください。

URL_startのところでは、今回METARを取得するURLを指定しています。

URL：https://tgftp.nws.noaa.gov/data/observations/metar/stations/

このURLは更新速度は遅いですが世界各国のMETARを4レター順にまとめてくれています。

自分の好きな空港の4レターがわからない場合は、[こちら](https://www.skytrophy.com/japan-prefecture/)で検索してみてください。

URLを見てみればわかりますが、RJTTのURLは

https://tgftp.nws.noaa.gov/data/observations/metar/stations/RJTT.TXT

となっているので、空港コードを除いた前半をURL_start、後半をURL_endとしています。

### 残り

        for i in airport:
        　content_start = i + "のMETARです\n"
        　URL = URL_start + i + URL_end
        　data = urllib.request.urlopen(URL)
        　html = str(data.read()).replace("'"," ").replace("b"," ").replace("\\n"," ")
        　data.close()

for文で一つ一つ指定した空港を取得しています。

URLの箇所で空港ごとのURLを生成しています。

それを、`urllib.request`で中身を取得し、成形をしています。

実際に取得してみるとわかりますが、htmlの中身をそのままとってくるので、改行の\\nなども取得されてしまいます。

それを消すために、replace関数で消しています。

METARをhtmlという変数内に保存されるので、Twitterに自動投稿するなり、データベースに入れるなりしてください。

### おまけ
私はTwitterに自動投稿したかったのでそのスクリプトを記載しておきます。


        import urllib.request
        import tweepy

        airport = ["RJCC","RJAA","RJTT","RJGG","RJOO","RJBB","RJFF","ROAH"]
        CONSUMER_KEY = ''
        CONSUMER_SECRET = ''
        ACCESS_TOKEN_KEY = ''
        ACCESS_TOKEN_SECRET = ''
        update_url = "https://api.twitter.com/1.1/statuses/update.json"

        URL_start = "http://tgftp.nws.noaa.gov/data/observations/metar/stations/"
        URL_end = ".TXT"

        auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
        auth.set_access_token(ACCESS_TOKEN_KEY,ACCESS_TOKEN_SECRET)
        api = tweepy.API(auth)

        for i in airport:
        　content_start = i + "のMETARです\n"
        　URL = URL_start + i + URL_end
        　data = urllib.request.urlopen(URL)
        　html = str(data.read()).replace("'"," ").replace("b"," ").replace("\\n"," ")
        　content_end = "\n#"+i+"　#"+i+"_METAR"
        　data.close()
        　try:
        　　api.update_status(content_start + html+ content_end)
        　except:
        　　pass
Twitterに投稿するためのライブラリはTweepyを用いています。

これを使うのが一番簡単です。間違えても、ライブラリを使わずにやろうと思わないでください笑

時間の無駄です。

次に、Twitterで開発者の申請を行ってください。

この部分は他の人がたくさん解説しているので、そちらのサイトを参照してください。

開発者申請して自分の「Keys and tokens」欄に行って、以下の情報をメモっておきましょう。

API key、API secret key、Access token、Access token secret

これらを以下のものに入れてください。

        CONSUMER_KEY =

        CONSUMER_SECRET =

        ACCESS_TOKEN_KEY =

        ACCESS_TOKEN_SECRET =


あとは、スクリプトをコピペすれば完璧です。

自動で空港のハッシュタグも追加するようになっています。

いらない場合は、

        content_end = "\n#"+i+"　#"+i+"_METAR"

の箇所を消してください。

また、Tweepyでは同じものをTweetしようとするとErrorが出てしまうので

        try: 　　api.update_status(content_start + html+ content_end) 　
        except: 　　pass

の箇所で、エラーの場合はTweetしないようにしています。

###最後に
今回の内容は自分の備忘録的な感じです。
自分のサイトも運営しているので興味ある人はぜひ！
https://www.skytrophy.com/