[スポンサーリンク]
Python3でウェブスクレイピング
Python3でウェブスクレイピングをしてみたいと思います
下記の2ステップで、ウェブから必要な情報を取得します
①reauestsライブラリで、ウェブからHTMLを取得
②Beautiful Soupライブラリで、HTMLから必要な情報取得
今回は、気象庁様のサイトから大阪府の天気予報を取得して、当日の天気予報を取得します
※2021/03/01時点 本方法では気象庁様サイト情報は取得出来ません
静的なサイトの情報は本記載で取得することは可能です
但し、気象庁様のサイトは動的ページに更新された為、本記載の方法では天気予報は取得出来ません
Requests-HTMLライブラリを利用して、天気予報を取得する方法を試してみましたので記録しています↓↓
reauestsライブラリでウェブからHTMLを取得
requestsライブラリとは
PythonでHTTPを使った通信を行う為のライブラリです
可読性が高く、コード作成も容易と評判の外部ライブラリです
Requests is an elegant and simple HTTP library for Python, built for human beings.
requestsライブラリのインストール
requestsライブラリのインストールは下記の記事で作業を記録しています
pip(Pip Installs Python)コマンドで簡単にインストール出来ます
requestsライブラリHTML取得 サンプルコード
・HTMLを取得するURLを設定
1 |
ScrapingGetHtmlUrl = 【Webスクレイピング対象URL】 |
・requestsのレスポンスを取得
1 |
ScrapingGetHtmlResponse = requests.get(ScrapingGetHtmlUrl) |
・HTMLが含まれるレスポンスのtextを取得
1 |
ScrapingGetHtmlResult = ScrapingGetHtmlResponse.text |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# coding: utf_8 # モジュールインポート import requests # WEBスクレイピングパラメータ設定 ScrapingGetHtmlUrl = 【Webスクレイピング対象URL】 # WEBスクレイピング実行 ScrapingGetHtmlResponse = requests.get(ScrapingGetHtmlUrl) if ScrapingGetHtmlResponse.status_code == 200: ScrapingGetHtmlResult = ScrapingGetHtmlResponse.text print(ScrapingGetHtmlResult) else: print("WEBスクレイピングに失敗") print(ScrapingGetHtmlResponse) |
requestsライブラリHTML取得 サンプルレスポンス
今回は、WebWebスクレイピングの対象として、気象庁様の大阪府の天気予報ページのHTMLを取得しました
WebページのHTMLが取得出来ていることが分かります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html xmlns:EXT_FNC="FORECAST" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="Author" content="気象庁 Japan Meteorological Agency"> <meta name="keywords" content="気象庁 Japan Meteorological Agency"> <title>気象庁 | 天気予報 : 大阪府</title> <link href="../common/default.css" rel="stylesheet" type="text/css" media="all"> <link href="../common/weather_info_v2.css" rel="stylesheet" type="text/css" media="all"> <link media="print" rel="stylesheet" type="text/css" href="../common/print.css"> <style type="text/css" media="all"> @import url(../common/weather_info_v2.css); #guide { margin-top: 0.5em; margin-bottom: 0.5em; border: 0px; } #explain { border: 0px; } #info { border: 0px; lheight: 16em; } .linkbtn { width: 95px; font-size:8pt; } .jikeibtn { width: 105px; font-size:8pt; } #info table { font-size: 100%; } #forecasttablefont{ font-size:100%; } </style> <link href="yoho.css" rel="stylesheet" type="text/css" media="all"> <script src="../common/weather_info.js" type="text/javascript"></script><script src="../common/contents_walker.js" type="text/javascript"></script><script src="../common/contents_list.js" type="text/javascript"></script><script language="javascript"> var SelectedAreaDefault = 0; var SelectedFukenDefault = 0; function goNextPage(page) { if (page!="#"&&page!="") { document.fukenlist.elfukenlist.selectedIndex = SelectedFukenDefault; document.arealist.elarealist.selectedIndex = SelectedAreaDefault; document.location.href=page; } } function goNext() { var page = "../week/" + document.additionInfo.fukenNo.value + ".html"; document.location.href=page; } function init() { SelectedAreaDefault = document.arealist.elarealist.selectedIndex; SelectedFukenDefault = document.fukenlist.elfukenlist.selectedIndex; showOtherInfoList(); } function goOtherInfo(){ selObj = getElementByIdFromDocument( "otherInfoList" ); if(selObj != null) { optObj = selObj.options[selObj.selectedIndex]; if(optObj != null) { key = optObj.value; if(key == 'c06'){ var fukenCode = getElementByIdFromDocument( "myAreaCode" ).value; var path = "../week/" + fukenCode + ".html"; document.location.href=path; } else if(key == 'c05'){ var fukenCode = getElementByIdFromDocument( "myAreaCode" ).value; var path = "../yoho/" + fukenCode + ".html"; document.location.href=path; } else{ jumpOtherInfo(); } } } } function goJikei() { var option = getElementByIdFromDocument("myAreaCode").value; var path = "../jikei/" + option + ".html"; document.location.href=path; } </script><script type="text/javascript" src="../common/jquery.js"></script><script type="text/javascript"> if (((navigator.userAgent.indexOf('iPhone') > 0 && navigator.userAgent.indexOf('iPad') == -1) || navigator.userAgent.indexOf('iPod') > 0 || (navigator.userAgent.indexOf('Android') > 0 && navigator.userAgent.indexOf('Mobile') > 0) || navigator.userAgent.indexOf('BlackBerry') > 0 || navigator.userAgent.indexOf('Windows Phone') > 0 || navigator.userAgent.indexOf('Windows CE') > 0)) { document.write("<meta name=\"viewport\" content=\"width=680,initial-scale=0.47; user-scale=yes\">"); } </script><script type="text/javascript"> if (((navigator.userAgent.indexOf('iPhone') > 0 && navigator.userAgent.indexOf('iPad') == -1) || navigator.userAgent.indexOf('iPod') > 0 || (navigator.userAgent.indexOf('Android') > 0 && navigator.userAgent.indexOf('Mobile') > 0) || navigator.userAgent.indexOf('BlackBerry') > 0 || navigator.userAgent.indexOf('Windows Phone') > 0 || navigator.userAgent.indexOf('Windows CE') > 0)) { document.write("<link rel=\"stylesheet\" href=\"../common/sph.css\">"); document.write("<script type=\"text/javascript\" src=\"../common/sph.js\"></scr"+"ipt>"); } </script> </head> <body onLoad="init();"> <noscript><div>すべての機能をご利用いただくにはJavascriptを有効にしてください。</div></noscript> <a name="top"></a><div id="top"> <div id="logo"><a href="/"><img src="../common/logo.gif" alt="気象庁 Japan Meteorological Agency" height="47" width="120"></a></div> <div id="header_right"> <div id="header_link"><ul> <li id="toMain"><a href="#main">本文へ</a></li> <li xml:lang="en" lang="en"><a href="/jma/indexe.html">ENGLISH</a></li> <li><a href="/jma/kishou/info/goiken.html">ご意見・ご感想</a></li> <li id="siteMap"><a href="/jma/kishou/sitemap.html">サイトマップ</a></li> </ul></div> <div id="gsearch"> <form id="cse-search-box" action="//google.com/cse"> <input type="hidden" name="cx" value="009950868052057056798:0yrbmp7chwi"><input type="hidden" name="ie" value="UTF-8"><input id="gsearch-text" type="text" name="q"><input id="gsearch-btn" type="image" name="sa" src="/jp/common/btn_search6.png" alt="検索"> </form> <script type="text/javascript" src="//www.google.com/cse/brand?form=cse-search-box&lang=ja"></script> </div> <script async="true" src="https://www.googletagmanager.com/gtag/js?id=UA-155983305-1"></script><script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-155983305-1'); </script> </div> <table id="global" cellspacing="0" cellpadding="0"><tr> <td class="side"><a href="/"><div>ホーム</div></a></td> <td class="side"><a href="/jma/menu/menuflash.html"><div class="here">防災情報</div></a></td> <td class="side"><a href="/jma/menu/menureport.html"><div>各種データ・資料</div></a></td> <td class="side"><a href="/jma/menu/menuknowledge.html"><div>知識・解説</div></a></td> <td class="side"><a href="/jma/menu/menuabout.html"><div>気象庁について</div></a></td> <td><a href="/jma/menu/menulinks.html"><div>案内・申請</div></a></td> </tr></table> <div id="nesting"> <a href="/">ホーム</a> > <a href="../../jma/menu/menuflash.html">防災情報</a> > 天気予報</div> </div> <div id="base"> <div id="sidebar"><div id="submenu" class="sidemenu"><table border="0" cellspacing="0" cellpadding="0"> <td></td> <td></td> <colgroup><col class="col1"></colgroup> <colgroup><col class="col2"></colgroup> <ul> <tr><td colspan="2">再読込ボタンかブラウザの更新ボタンをクリックして最新の情報をお使いください。</td></tr> <tr><td colspan="2"><img width="100%" height="2px" src="../common/line_menu.gif" alt=""></td></tr> <tr><td colspan="2"><li> <a href="/jp/warn/">気象警報・注意報</a> </li></td></tr> <tr><td colspan="2"><li> 大雨・洪水警報の危険度分布</li></td></tr> <tr><td colspan="2"> <a href="/jp/doshamesh/">土砂災害</a> / <a href="/jp/suigaimesh/inund.html">浸水害</a> / <a href="/jp/suigaimesh/flood.html">洪水</a> </td></tr> <tr><td colspan="2"><li> <a href="/jp/kishojoho/">気象情報</a> </li></td></tr> <tr><td colspan="2"><li> 海上警報 <a href="/jp/seawarn/">気象</a> / <a href="/jp/kaijyo/">火山</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/typh/">台風情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/flood/">指定河川洪水予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/dosha/">土砂災害警戒情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/tatsumaki/">竜巻注意情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/fcd/yoho/data/kouon/">高温注意情報</a> </li></td></tr> <tr><td colspan="2"><img width="100%" height="2px" src="../common/line_menu.gif" alt=""></td></tr> <tr><td colspan="2"><li> <a href="/jp/tsunami/">大津波警報・津波警報・津波注意報、津波情報、津波予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/quake/">地震情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/svd/eew/data/nteq/index.html">南海トラフ地震関連情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/volcano/">噴火警報・予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/funkasokuho/">噴火速報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/ashfall/">降灰予報</a> </li></td></tr> <tr><td colspan="2"><img width="100%" height="2px" src="../common/line_menu.gif" alt=""></td></tr> <tr><td colspan="2"><li> <a href="/jp/yoho/">天気予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/fcd/yoho/wdist/jp/">天気分布予報・時系列予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/week/">週間天気予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/seafcst/">海上予報</a> / <a href="//www.data.jma.go.jp/fcd/yoho/umimesh/jp/">海上分布予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/gmd/cpd/twoweek/">2週間気温予報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/gmd/cpd/souten/">早期天候情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/longfcst/" target="_top">季節予報(1か月・3か月・暖候期・寒候期)</a> </li></td></tr> <tr><td colspan="2"><img width="100%" height="2px" src="../common/line_menu.gif" alt=""></td></tr> <tr><td colspan="2"><li> <a href="/jp/g3/">天気図</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/highresorad/">雨雲の動き(高解像度降水ナウキャスト)</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/kaikotan/">今後の雨(降水短時間予報)</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/fcd/yoho/snow/jp/">現在の雪(解析積雪深・解析降雪量)</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/radnowc/">レーダー・ナウキャスト(降水・雷・竜巻)</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/gms/">気象衛星</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/gms150jp/">気象衛星(高頻度)</a> </li></td></tr> <tr><td colspan="2"><li> アメダス <a href="/jp/amedas/">地図形式</a> / <a href="/jp/amedas_h/">表形式</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/kuko/">空港の気象</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/windpro/">ウィンドプロファイラ(上空の風)</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/gmd/env/kosa/fcst/">黄砂情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="//www.data.jma.go.jp/gmd/env/uvindex/">紫外線情報</a> </li></td></tr> <tr><td colspan="2"><img width="100%" height="2px" src="../common/line_menu.gif" alt=""></td></tr> <tr><td colspan="2"><li> <a href="/jp/choi/">潮位観測情報</a> </li></td></tr> <tr><td colspan="2"><li> <a href="/jp/wave/">波浪観測情報</a> </li></td></tr> </ul> </table></div></div> <div id="main"> <img src="/jma/trouble/trouble.png" alt=""><div id="title"><table><tr> <td class="titleText"><h1>天気予報 : 大阪府</h1></td> <td class="titleOthers"><div id="others" class="select"><table><tr> <td width="120">その他の情報</td> <td> <input id="myAreaCode" type="hidden" value="331"><input id="myContentsId" type="hidden" value="c05"><select size="1" id="otherInfoList" onChange="jumpOtherInfo()"></select> </td> </tr></table></div></td> </tr></table></div> <div id="refre"><input type="button" title="再読込" value="再読込" onclick="document.location.reload();"></div> <div id="print"><input type="button" title="天気予報を印刷します。" value="印刷" onclick="print();"></div> <div id="area" class="select"> <form name="additionInfo"><input type="hidden" name="fukenNo" value="331"></form> <table><tr> <td>地方</td> <td><form name="arealist"><select size="1" name="elarealist" onChange="javascript:goNextPage(this.options[this.selectedIndex].value)"><option></option> <option value="000.html">全国</option> <option value="201.html">北海道地方(北西部)</option> <option value="202.html">北海道地方(東部)</option> <option value="203.html">北海道地方(南西部)</option> <option value="204.html">東北地方(北部)</option> <option value="205.html">東北地方(南部)</option> <option value="206.html">関東地方</option> <option value="207.html">甲信地方</option> <option value="208.html">北陸地方(東部)</option> <option value="209.html">北陸地方(西部)</option> <option value="210.html">東海地方</option> <option value="211.html">近畿地方</option> <option value="212.html">中国地方</option> <option value="213.html">四国地方</option> <option value="214.html">九州地方(北部)</option> <option value="215.html">九州地方(南部)</option> <option value="216.html">奄美地方</option> <option value="217.html">沖縄本島地方</option> <option value="219.html">宮古・八重山地方</option></select></form></td> <td> 府県</td> <td><form name="fukenlist"><select size="1" name="elfukenlist" onChange="javascript:goNextPage(this.options[this.selectedIndex].value)"><option></option> <option value="301.html">宗谷地方</option> <option value="302.html">上川・留萌地方</option> <option value="303.html">網走・北見・紋別地方</option> <option value="304.html">釧路・根室・十勝地方</option> <option value="305.html">胆振・日高地方</option> <option value="306.html">石狩・空知・後志地方</option> <option value="307.html">渡島・檜山地方</option> <option value="308.html">青森県</option> <option value="309.html">秋田県</option> <option value="310.html">岩手県</option> <option value="311.html">山形県</option> <option value="312.html">宮城県</option> <option value="313.html">福島県</option> <option value="314.html">茨城県</option> <option value="315.html">群馬県</option> <option value="316.html">栃木県</option> <option value="317.html">埼玉県</option> <option value="318.html">千葉県</option> <option value="319.html">東京都</option> <option value="320.html">神奈川県</option> <option value="321.html">山梨県</option> <option value="322.html">長野県</option> <option value="323.html">新潟県</option> <option value="324.html">富山県</option> <option value="325.html">石川県</option> <option value="326.html">福井県</option> <option value="327.html">静岡県</option> <option value="328.html">岐阜県</option> <option value="329.html">愛知県</option> <option value="330.html">三重県</option> <option value="331.html" selected>大阪府</option> <option value="332.html">兵庫県</option> <option value="333.html">京都府</option> <option value="334.html">滋賀県</option> <option value="335.html">奈良県</option> <option value="336.html">和歌山県</option> <option value="337.html">島根県</option> <option value="338.html">広島県</option> <option value="339.html">鳥取県</option> <option value="340.html">岡山県</option> <option value="341.html">香川県</option> <option value="342.html">愛媛県</option> <option value="343.html">徳島県</option> <option value="344.html">高知県</option> <option value="345.html">山口県</option> <option value="346.html">福岡県</option> <option value="347.html">佐賀県</option> <option value="348.html">長崎県</option> <option value="349.html">熊本県</option> <option value="350.html">大分県</option> <option value="351.html">宮崎県</option> <option value="352.html">鹿児島県</option> <option value="353.html">沖縄本島地方</option> <option value="354.html">大東島地方</option> <option value="355.html">宮古島地方</option> <option value="356.html">八重山地方</option></select></form></td> </tr></table> </div> <div id="jumpExplain" class="innerJump"><a href="#explain">説明へ</a></div> <div id="guide"> <a href="/jma/kishou/keika/331.html"> 早期注意情報(警報級の可能性)へ</a><br><a href="//www.data.jma.go.jp/fcd/yoho/wdist/jp/">天気分布予報・時系列予報へ</a><br> </div> <div> <table class="forecast" id="forecasttablefont"> <caption style="text-align:left;">2日11時大阪管区気象台発表の天気予報(今日2日から明後日4日まで) </caption> <tr> <th colspan="2" class="th-area"><div style="float: left">大阪府</div></th> <th class="th-rain">降水確率</th> <th class="th-temp">気温予報</th> </tr> <tr> <th class="weather"> 今日2日<br><img src="img/100.png" align="middle" title="晴れ" alt="晴れ"><br> </th> <td class="info">南西の風 海上 では 南西の風 やや強く 晴れ<br>波 0.5メートル 後 1メートル</td> <td class="rain"><div class="font-size-clear"><table class="rain"> <tr> <td align="left">00-06</td> <td align="right">--%</td> </tr> <tr> <td align="left">06-12</td> <td align="right">--%</td> </tr> <tr> <td align="left">12-18</td> <td align="right">0%</td> </tr> <tr> <td align="left">18-24</td> <td align="right">0%</td> </tr> </table></div></td> <td class="temp"><div class="font-size-clear"><table class="temp"> <tr> <th></th> <th></th> <th nowrap> 日中の最高 </th> </tr> <tr> <td class="city">大阪</td> <td class="min"></td> <td class="max">27度 </td> </tr> </table></div></td> </tr> <tr> <th class="weather"> 明日3日<br><img src="img/200.png" align="middle" title="曇り" alt="曇り"><br> </th> <td class="info">南西の風 くもり 所により 夕方 から 雨<br>波 0.5メートル</td> <td class="rain"><div class="font-size-clear"><table class="rain"> <tr> <td align="left" nowrap>00-06</td> <td align="right">10%</td> </tr> <tr> <td align="left" nowrap>06-12</td> <td align="right">10%</td> </tr> <tr> <td align="left" nowrap>12-18</td> <td align="right">20%</td> </tr> <tr> <td align="left" nowrap>18-24</td> <td align="right">40%</td> </tr> </table></div></td> <td class="temp"><div class="font-size-clear"><table class="temp"> <tr> <th></th> <th nowrap>朝の最低</th> <th nowrap>日中の最高</th> </tr> <tr> <td class="city">大阪</td> <td class="min">14度</td> <td class="max">24度</td> </tr> </table></div></td> </tr> <tr> <th class="weather"> 明後日4日<br><img src="img/202.png" align="middle" title="曇り一時雨" alt="曇り一時雨"><br> </th> <td class="info">北東の風 後 西の風 くもり 一時 雨<br>波 0.5メートル</td> <td class="rain"><div class="font-size-clear"><table class="rain"> <tr> <td><br></td> <td rowspan="4"><div><input class="linkbtn" type="button" title="週間天気予報へ" value="週間天気予報へ" onclick="javascript:goNext()"></div></td> <td><br></td> </tr> <tr> <td><br></td> <td><br></td> </tr> <tr> <td><br></td> <td><br></td> </tr> <tr> <td><br></td> <td><br></td> </tr> </table></div></td> <td class="temp"> </td> </tr> </table> <div class="fortemplete">(/:のち, |:時々または一時)</div> <br> </div> <pre class="textframe">天気概況 令和02年5月2日10時34分 大阪管区気象台発表 <b> 大阪府では、2日まで空気の乾燥した状態が続くため、火の取り扱いに注 意してください。</b> 大阪府は、高気圧に覆われて、晴れています。 2日の大阪府は、高気圧に覆われて晴れる見込みです。 3日の大阪府は、気圧の谷や前線が近づいてくるため曇り、夕方からは雨の降る所があるでしょう。 【近畿地方】 近畿地方は、高気圧に覆われて、晴れています。 2日の近畿地方は、高気圧に覆われて晴れる見込みです。 3日の近畿地方は、気圧の谷や前線が近づいてくるため次第に雲が広がり、夕方からは南部を中心に雨が降るでしょう。</pre> <div id="explain"> <a name="explain"></a> 毎日5時・11時・17時に発表します。<br> また、この時間以外にも状況により随時発表します。<br> 最新の天気予報をご利用ください。 <br><br><ul class="pagelink"> <li><a href="/jma/kishou/know/kurashi/yoho.html">天気予報について</a></li> <li><a href="/jma/kishou/know/saibun/index.html">天気予報の発表区域について</a></li> </ul> </div> <div id="gotop"><a href="#top">このページのトップへ</a></div> </div> </div> <div id="foot"> <p>気象庁:〒100-8122東京都千代田区大手町1-3-4 代表電話:03-3212-8341</p> <a href="/jma/kishou/info/coment.html">気象庁ホームページについて</a> </div> </body> </html> |
Beautiful SoupライブラリでHTMLから必要な情報取得
Beautiful Soupライブラリとは
PythonでHTMLやXMLファイルからデータを取得する為のライブラリです
パーサ(構文解析)を非常に簡単に出来るライブラリで、下記の記載の通り、短時間での情報取得を実現してくれます
It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers hours or days of work.
Beautiful Soupライブラリのインストール
pipコマンドで簡単にインストール出来ます
pip(Pip Installs Python)のインストールは下記の記事で作業を記録しています
1 |
pip install beautifulsoup4 |
1 2 3 4 5 6 7 8 9 |
# pip install beautifulsoup4 WARNING: Running pip install with root privileges is generally not a good idea. Try `pip install --user` instead. Collecting beautifulsoup4 Downloading https://files.pythonhosted.org/packages/cb/a1/c698cf319e9cfed6b17376281bd0efc6bfc8465698f54170ef60a485ab5d/beautifulsoup4-4.8.2-py3-none-any.whl (106kB) 100% |????????????????????????????????| 112kB 3.0MB/s Collecting soupsieve>=1.2 (from beautifulsoup4) Downloading https://files.pythonhosted.org/packages/05/cf/ea245e52f55823f19992447b008bcbb7f78efc5960d77f6c34b5b45b36dd/soupsieve-2.0-py2.py3-none-any.whl Installing collected packages: soupsieve, beautifulsoup4 Successfully installed beautifulsoup4-4.8.2 soupsieve-2.0 |
Beautiful Soupライブラリパース サンプルコード
requestsライブラリを使って、気象庁様の大阪府の天気予報のページのHTMLを取得しました
Beautiful Soupライブラリで、HTMLをパースして、当日の天気予報と降水確率を取り出します
・取得したHTML(ScrapingGetHtmlResult)をHTML(html.parser)としてパース(構文解析)
1 |
ScrapingPerthHtmlSoap = BeautifulSoup(ScrapingGetHtmlResult, 'html.parser') |
・天気予報を取得
気象庁様のサイトでは、天気予報を太陽や雲の画像で表示しています
今回は天気予報を示す画像のタイトルを取得することで、天気予報を文字で取得します
.find(‘th’, {‘class’: ‘weather’}) → 「weather」クラスのthタグの情報を取得
.find(‘img’) → imgタグの情報を取得
.attrs[‘title’] → title要素を取得
1 |
WeatherForecastOsaka = ScrapingPerthHtmlSoap.find('th', {'class': 'weather'}).find('img').attrs['title'] |
1 2 3 |
<th class="weather"> 今日2日<br><img src="img/100.png" align="middle" title="晴れ" alt="晴れ"><br> </th> |
・降水確率を取得
気象庁様のサイトでは、今日、明日、明後日の3日分の降水確率を表示しています
降水確率が6時間毎の4つのパーセント表示で、一日の降水確率を表示しています
.find(‘td’, {‘class’: ‘rain’}) → 「rain」クラスのtdタグの情報を取得。findを使用しているので一つ目の要素(今日)の降水確率を取得。
.find_all(‘td’, {‘align’: ‘right’}) → 「align」属性がrightとなっているtdタグの情報を取得。find_allを使用しているので、全ての要素(6時間毎の4つのパーセント表示)を取得。
1 |
RainyPercentOsakaList = ScrapingPerthHtmlSoap.find('td', {'class': 'rain'}).find_all('td', {'align': 'right'}) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<td class="rain"><div class="font-size-clear"><table class="rain"> <tr> <td align="left">00-06</td> <td align="right">--%</td> </tr> <tr> <td align="left">06-12</td> <td align="right">--%</td> </tr> <tr> <td align="left">12-18</td> <td align="right">0%</td> </tr> <tr> <td align="left">18-24</td> <td align="right">0%</td> </tr> </table></div></td> |
・取得した降水確率(6時間毎の4つのパーセント表示)を含むtdタグの情報からテキストを取得
1 2 |
for RainyPercentOsakaItem in RainyPercentOsakaList: print(RainyPercentOsakaItem.get_text()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# coding: utf_8 # モジュールインポート import requests from bs4 import BeautifulSoup # WEBスクレイピングパラメータ設定 ScrapingGetHtmlUrl = 'https://www.jma.go.jp/jp/yoho/331.html' # WEBスクレイピング実行 ScrapingGetHtmlResponse = requests.get(ScrapingGetHtmlUrl) if ScrapingGetHtmlResponse.status_code == 200: ScrapingGetHtmlResult = ScrapingGetHtmlResponse.text # パース実行 ScrapingPerthHtmlSoap = BeautifulSoup(ScrapingGetHtmlResult, 'html.parser') WeatherForecastOsaka = ScrapingPerthHtmlSoap.find('th', {'class': 'weather'}).find('img').attrs['title'] RainyPercentOsakaList = ScrapingPerthHtmlSoap.find('td', {'class': 'rain'}).find_all('td', {'align': 'right'}) print("【大阪府の天気予報】\n" + WeatherForecastOsaka) print("【大阪府の降水確率】") for RainyPercentOsakaItem in RainyPercentOsakaList: print(RainyPercentOsakaItem.get_text()) else: print("WEBスクレイピングに失敗") print(ScrapingGetHtmlResponse) |
Beautiful Soupライブラリパース サンプルレスポンス
スクレイピング当日の天気予報と、6時間毎の降水確率を取得出来ました
午後に実行したので、午前の(0-6,6-12)は–%表示になっています
Beautiful Soupを使うと、HTMLが簡単に構文解析出来て、欲しい情報を取得出来ます
尚、HTMLベースの情報取得なので、取得サイトのレイアウト変更等があった場合は、対処が必要になります
1 2 3 4 5 6 7 |
【大阪府の天気予報】 晴れ 【大阪府の降水確率】 --% --% 0% 0% |
[スポンサーリンク]
コメント