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]
天気 曇
風 南西の風
新潟の他にもいろんな都市もできるのでやってみてください
コメント