皆さんこんにちは。いし(@ishilog2)です。
今回はPythonを用いて、Yahoo天気からデータ取得したいと思います。
スクレイピングが禁止されているWEBページもあるのでお気を付けください。

事前準備
今回のサンプルではrequestsとBeautifulSoupを使用します。
インストールしていない方はインストールして下さい。
pip install requests
pip install beautifulsoup4
実践
実施すること
Yahoo天気予報から本日の天気と明日の天気を取得します。
https://weather.yahoo.co.jp/weather/jp/13/4410.html
サンプルコード
import requests
from bs4 import BeautifulSoup
def Weather(AreaCode):
url = "https://weather.yahoo.co.jp/weather/jp/13/" + str(AreaCode) + ".html"
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
rs = soup.find(class_='forecastCity')
rs = [i.strip() for i in rs.text.splitlines()]
rs = [i for i in rs if i != ""]
print(rs[0] + "の天気は" + rs[1] + "、明日の天気は" + rs[19] + "です。")
Weather(4410)
このサンプルを使用すると次のような結果が取得できます。
6月29日(火)の天気は曇り、明日の天気は曇りです。
解説
① requestsを用いてHTMLを取得
url = "https://weather.yahoo.co.jp/weather/jp/13/" + str(AreaCode) + ".html" r = requests.get(url)
requests.get(‘URL’)でYahoo天気のHTML情報を全て取得します。取得した内容を変数rに格納しています。
② BeautifulSoupを使用してhtml形式にパース
soup = BeautifulSoup(r.text, 'html.parser')
①で習得したHTMLからBeautifulSoupオブジェクトを作成します。
[st-mybox title=”パース(parse)とは” fontawesome=”fa-file-text-o” color=”#757575″ bordercolor=”” bgcolor=”#fafafa” borderwidth=”0″ borderradius=”5″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]自分の環境で扱えるように解析、変換することをparseと言います。そしてパースする処理をまとめたプログラムのことをパーサー(parser)といいます。今回使用しているBeautifulSoupはこのパーサーとなります。
[/st-mybox]
③ データの抽出
rs = soup.find(class_='forecastCity')
「forecastCity」というクラスの内容を変数rsに格納します。rsはリスト型となります。
④ リストの加工
このままだとリスト内に不要データが多いため無駄なデータを省いていきます。
rs = [i.strip() for i in rs.text.splitlines()]
リスト内表記を使用して、splitlines()で改行コードで分割し、strip()で文字列の前後の空白を削除します。
上記コードを実行すると次のような結果が得られます。
['', '', '', '', '', '6月29日(火)', '', '曇り', '', '', '26℃[-3]', '20℃[-1]', '', '', '', '時間', '0-6', '6-12', '12-18', '18-24', '', '', '降水', '---', '---', '30%', '30%', '', '', '', '風:', '北の風後東の風23区 西部では北の風やや強く', '波:', '1メートル後0.5メートル', '', '', '', '', '', '6月30日(水)', '', '曇り', '', '', '26℃[0]', '21℃[+1]', '', '', '', '時間', '0-6', '6-12', '12-18', '18-24', '', '', '降水', '10%', '10%' , '20%', '20%', '', '', '', '風:', '北の風後東の風', '波:', '0.5メートル', '', '', '', '', '']
次にリスト内の空白要素を削除します。
rs = [i for i in rs if i != ""]
上記コードを実行すると次のような結果が得られます。
['6月29日(火)','曇り','26℃[-3]','20℃[-1]','時間','0-6','6-12','12-18','18-24','降水','---','---','30%','30%','風:','北の風後東の風23区西部では北の風やや強く','波:','1メートル後0.5メートル','6月30日(水)','曇り','26℃[0]','21℃[+1]','時間','0-6','6-12','12-18','18-24','降水','10%','10%','20%','20%','風:','北の風後東の風','波:','0.5メートル']
⑤ リストからデータを取り出す
print(rs[0] + "の天気は" + rs[1] + "、明日の天気は" + rs[19] + "です。")
リストから取り出すには変数[要素の箇所]となります。リスト内の要素は左から0始まりでアクセスできます。
今回の場合の各要素の場所は次の画像を参考にして下さい。

【おまけ】地域コード表
都道府県 | 地域 | コード |
北海道 | 稚内 | 1100 |
旭川 | 1200 | |
留萌 | 1300 | |
札幌 | 1400 | |
岩見沢 | 1500 | |
倶知安 | 1600 | |
網走 | 1710 | |
北見 | 1720 | |
紋別 | 1730 | |
根室 | 1800 | |
釧路 | 1900 | |
帯広 | 2000 | |
室蘭 | 2100 | |
浦河 | 2200 | |
函館 | 2300 | |
江差 | 2400 | |
青森 | 青森 | 3110 |
むつ | 3120 | |
八戸 | 3130 | |
岩手 | 盛岡 | 3310 |
宮古 | 3320 | |
大船渡 | 3330 | |
宮城 | 仙台 | 3410 |
白石 | 3420 | |
秋田 | 秋田 | 3210 |
横手 | 3220 | |
山形 | 山形 | 3510 |
米沢 | 3520 | |
酒田 | 3530 | |
新庄 | 3540 | |
福島 | 福島 | 3610 |
小名浜 | 3620 | |
若松 | 3630 | |
茨城 | 水戸 | 4010 |
土浦 | 4020 | |
栃木 | 宇都宮 | 4110 |
大田原 | 4120 | |
群馬 | 前橋 | 4210 |
みなかみ | 4220 | |
埼玉 | さいたま | 4310 |
熊谷 | 4320 | |
秩父 | 4330 | |
千葉 | 千葉 | 4510 |
銚子 | 4520 | |
館山 | 4530 | |
東京 | 東京 | 4410 |
大島 | 4420 | |
八丈島 | 4430 | |
父島 | 4440 | |
神奈川 | 横浜 | 4610 |
小田原 | 4620 | |
新潟 | 新潟 | 5410 |
長岡 | 5420 | |
高田 | 5430 | |
相川 | 5440 | |
富山 | 富山 | 5510 |
伏木 | 5520 | |
石川 | 金沢 | 5610 |
輪島 | 5620 | |
福井 | 福井 | 5710 |
敦賀 | 5720 | |
山梨 | 甲府 | 4910 |
河口湖 | 4920 | |
長野 | 長野 | 4810 |
松本 | 4820 | |
飯田 | 4830 | |
岐阜 | 岐阜 | 5210 |
高山 | 5220 | |
静岡 | 静岡 | 5010 |
網代 | 5020 | |
三島 | 5030 | |
浜松 | 5040 | |
愛知 | 名古屋 | 5110 |
豊橋 | 5120 | |
三重 | 津 | 5310 |
尾鷲 | 5320 | |
滋賀 | 大津 | 6010 |
彦根 | 6020 | |
京都 | 京都 | 6110 |
舞鶴 | 6120 | |
大阪 | 大阪 | 6200 |
兵庫 | 神戸 | 6310 |
豊岡 | 6320 | |
奈良 | 奈良 | 6410 |
風屋 | 6420 | |
和歌山 | 和歌山 | 6510 |
潮岬 | 6520 | |
鳥取 | 鳥取 | 6910 |
米子 | 6920 | |
島根 | 松江 | 6810 |
浜田 | 6820 | |
西郷 | 6830 | |
岡山 | 岡山 | 6610 |
津山 | 6620 | |
広島 | 広島 | 6710 |
庄原 | 6720 | |
山口 | 下関 | 8110 |
山口 | 8120 | |
柳井 | 8130 | |
萩 | 8140 | |
徳島 | 徳島 | 7110 |
日和佐 | 7120 | |
香川 | 高松 | 7200 |
愛媛 | 松山 | 7310 |
新居浜 | 7320 | |
宇和島 | 7330 | |
高知 | 高知 | 7410 |
室戸岬 | 7420 | |
清水 | 7430 | |
福岡 | 福岡 | 8210 |
八幡 | 8220 | |
飯塚 | 8230 | |
久留米 | 8240 | |
佐賀 | 佐賀 | 8510 |
伊万里 | 8520 | |
長崎 | 長崎 | 8410 |
佐世保 | 8420 | |
厳原 | 8430 | |
福江 | 8440 | |
熊本 | 熊本 | 8610 |
阿蘇乙姫 | 8620 | |
牛深 | 8630 | |
人吉 | 8640 | |
大分 | 大分 | 8310 |
中津 | 8320 | |
日田 | 8330 | |
佐伯 | 8340 | |
宮崎 | 宮崎 | 8710 |
延岡 | 8720 | |
都城 | 8730 | |
高千穂 | 8740 | |
鹿児島 | 鹿児島 | 8810 |
鹿屋 | 8820 | |
種子島 | 8830 | |
名瀬 | 8840 | |
沖縄 | 那覇 | 9110 |
名護 | 9120 | |
久米島 | 9130 | |
南大東 | 9200 | |
宮古島 | 9300 | |
石垣島 | 9410 | |
与那国島 | 9420 |