Make

tenki.jpをWebスクレイピングしてみた

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

Webスクレイピングをやりたい思いました

とくに深い意味はないのですが、やってみたいなーという気になりました

身近でお手軽なものということで天気情報を発信しているサイトをスクレイピングしてみました

手始めにtenki.jpをやってみました

tenki.jpとは

一般財団法人日本気象協会と株式会社ALiNKインターネットが運営している天気予報専門サービスです

様々な観測情報や予測情報、気象協会独自の予測モデル等により解析したものとなっています

参考:https://tenki.jp/docs/help/#a00-00

 

Googleで天気情報で検索すると上位に表示されるためこのサイトにしました

プログラム

プログラムは以下のようになっています

前提として局所的な天気(〇〇県〇〇市〇〇町)でなく、広域の市まで(〇〇県〇〇市)の天気情報の取得としています

pythonで組み、BeautifulSoupを使ってスクレイピングしています

BeautifulSoupは簡単にスクレイピングできて便利です

 

注意点として、現時点(2018/10/02)での動作です

サイトの更新等でできない可能性があります

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

#Tenkiの取得
def Tenki(address):
    Url = "https://tenki.jp"

    Req = requests.get(Url + "/search/?keyword=" + address)
    Soup = BeautifulSoup(Req.text, 'lxml')


    Sed = Soup.find_all(class_="search-entry-data")

    HrfUrl = None
    for val in Sed:
        if val.find(class_="address").text.find("以下に掲載がない場合"):
            HrfUrl = val.a.get("href")
            break


    myDict = {}
    #住所からhrefを取得
    if not(HrfUrl is None):
        time.sleep(1) #一回requestを投げているので1秒待つ
        Req = requests.get(Url + HrfUrl)
        Soup = BeautifulSoup(Req.text, 'lxml')

        TodaySoup = Soup.find(class_="today-weather")

        #気温(最高)
        myDict["気温(最高)"] = TodaySoup.find(class_="weather-wrap").find(class_="high-temp temp").find(class_="value").text + TodaySoup.find(class_="weather-wrap").find(class_="high-temp tempdiff").text

        #気温(最低)
        myDict["気温(最低)"] = TodaySoup.find(class_="weather-wrap").find(class_="low-temp temp").find(class_="value").text + TodaySoup.find(class_="weather-wrap").find(class_="low-temp tempdiff").text

        #天気
        myDict["天気"] = TodaySoup.find(class_="weather-wrap").find(class_="weather-telop").text

        #風
        myDict["風"] = TodaySoup.find(class_="wind-wave").find("td").text

    return myDict


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

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


if __name__ == '__main__':
    main("新潟県新潟市西区")

プログラムの説明

mainのなかに住所(市まで)を入れると今日の天気情報を取得できます

 

関数Tenki()なのですが、ちょっと特殊に組んでいます

例えば”新潟県新潟市西区”にのURLは下記のようになっています

https://tenki.jp/forecast/4/18/5410/15103/

 

末尾の”/4/18/5410/15103/”がどのような生成方法か不明であったため、一度検索を行うURL(下記)をリクエストして、”新潟県新潟市西区”のURLを取得しにいっています

https://tenki.jp/search/?keyword=新潟県新潟市西区

 

今回は前提として局所的な天気でなく、広域の市までの天気情報が知りたいため、”950-0000新潟県新潟市西区以下に掲載がない場合”のURLを取得しました

htmlでみると下記のようになっており、hrefの値をもらい、Urlを合体しています

<a href="/forecast/4/18/5410/15107/"><span class="zipcode">950-0000</span><span class="address">新潟県新潟市西区以下に掲載がない場合</span></a>

 

あとは気温や天気、風情報を取得して出力をしています

辞書型の添字が日本語で少し気持ち悪いですが、便宜上このようにしています

実行結果(一例)

新潟県新潟市西区の天気
気温(最高) 22[-1]
気温(最低) 18[-2]
天気 曇
風 南西の風

 

新潟の他にもいろんな都市もできるのでやってみてください

コメント

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