1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

概要

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

METARを知らない方はこちら

まあ、これを読んでいる人はほとんどの方は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レターがわからない場合は、こちらで検索してみてください。

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

となっているので、空港コードを除いた前半を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/

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?