Make

ウェザーニュースをWebスクレイピングしてみた

Make
この記事は約5分で読めます。
スポンサーリンク

Webスクレイピングしてみたい第二弾です

Tenki.jpのスクレイピングに引き続き、次はウェザーニュースをスクレイピングしてみました

ウェザーニュースとは

ウェザーニュースは民間気象情報会社です

ウェザーニュースの天気情報は、テレビ等にも使われており信頼性が高いです

インターネットでもGoogleにて「〇〇 天気」(〇〇には住所)と検索すると一番最初に検索結果が表示されています。

プログラム

プログラムの前に前提として、以前の記事同様、ピンポイントの天気情報ではなく〇〇県〇〇市までの天気情報のスクレイピングにしています

プログラムは下記のようにしました

作成した現在(2018/10/03)は、動作することを確認しましたが、サイトの更新等で動作しない可能性があります

 

tenki.jpとは異なり、URLの生成規則がわかりやすくて助かりました

例えば、石川県金沢市の天気の天気情報を知りたいときは下記のURLになります

https://weathernews.jp/onebox/36.564711/136.671794/temp=c&q=石川県金沢市&v=1485b898f49fc7accf39215f11faa11a824fed7b32d23f5c1de1e1f67d5a7ad4&lang=ja

 

いろいろと値を渡していますが、注目したところはonebox以下のURLです

https://weathernews.jp/onebox/36.564711/136.671794/

どこかで見覚えがあるなぁと思ったら緯度と経度でした

これを緯度と経度で地図で表示できるサイトにて表示するとドンピシャでした

http://fukuno.jig.jp/app/printmap/latlngmap.html#15/36.564711/136.671794/&base=std&ls=std&disp=1&vs=c1j0l0u0f1

 

ということで、逆に住所から緯度経度だしてそれを渡してあげれば引数に応じた天気情報を取得できると考え作ってみました

#!/usr/bin/python
# -*- Coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup


#緯度経度を取得
def Location(address):
    Url = "https://www.geocoding.jp/api/"
    Params = {"q":address}
    Req = requests.get(Url, params=Params)
    Soup = BeautifulSoup(Req.text, 'lxml')


    return Soup.find("lat").text, Soup.find("lng").text


#WeatherNewsの取得
def WeatherNews(address):
    Url = "https://weathernews.jp/onebox/"

    #緯度経度を取得
    (Lat, Lng) = Location(address)

    SrhUrl = Url + Lat + '/' + Lng + "/lang=ja"

    Req = requests.get(SrhUrl)
    Soup = BeautifulSoup(Req.text, 'lxml')

    #Dict
    myDict = {}

    #天気
    myDict["天気"] = Soup.find(class_="sub").text.split(", ")[1]

    #気温
    myDict["気温"] = Soup.find(class_="obs_temp_main").text

    #風速とかの情報
    for val in Soup.find(class_="table-obs_sub").find_all("tr"):
        myDict[val.find(class_="obs_sub_title").text] = val.find(class_="obs_sub_value").text.replace(" : ","")

    return myDict

def main(address):
    print(address + "の天気")
    print("---")
    Rst = WeatherNews(address)

    for val in Rst:
        print(val, Rst[val])


if __name__ == '__main__':
    main("石川県金沢市")

 

プログラムの解説

main()にて天気情報がほしい住所を与えてあげます

その後、住所から緯度経度がほしいため、Geocodingという住所から緯度経度を返してくれるAPIへ住所を投げて緯度経度を取得しています

 

Geocodingにて少し触れると、無料で住所から緯度経度を取得できるAPIです

一方で利用規約ではプログラムによる大量アクセスを控えることや、1回のリクエストあたり5~10秒待ちをいれなければならないという決まりごとがあります

そのため、このプログラムを大量に、短い間隔で何回も使用しないでください

 

緯度経度を取得後、ウェザーニュースのURLに貼り付けて検索結果をもらってきます

今回は日本語でほしいため、引数にlang=jaを追加しています

あとは必要な要素を取り出して表示をしている流れになっています

結果は連想配列でもらっていますが、便宜上添字を日本語にしています

実行結果(一例)

石川県金沢市の天気情報を取得した一例を示します

石川県金沢市の天気

天気 晴れ
気温 23.8
湿度 56 %
気圧 1021 hPa
風 北東 3 m/s
日の出 05:50
日の入 17:35

 

tenki.jpのスクレイピング同様、他の住所もできるのでやってみてください

コメント

タイトルとURLをコピーしました