バックエンド

【PHP】ホームページに天気予報を表示させる方法【Webスクレイピング】【初心者向け】

とある方
これから冬になると、雪が降ることが多いから、ホームページに天気予報をのせておいたほうがいいと思うんです。

先日とある方よりいただいたご要望。

確かに冬になれば、地域によっては雪が降り積もりますし、梅雨になれば、雨ザーザーになっちゃいますし。

アオキ
ホームページに天気予報を表示させたいという方は意外に多いのかもしれないなぁ

と思い、

さくっとつくってみましたのでその時の方法をまとめてみることにしました。

Sponsored link

ホームページに天気予報を表示させる方法

天気予報といえば、Yahoo天気やウェザーニュースなどが有名と思いますが、

毎日毎日そういったサイトに行って、

天気予報をチェックして、
自分のホームページに掲載するというのは、

できないことはないけれどさすがにしんどく、手間暇かかってしまいます。

そんな時に便利なのがプログラミング

天気予報のサイトからその日のデータをひっぱってきて、
自分のホームページに掲載させるということが簡単にできてしまいます。

もちろん毎日データを書き換えるといった手間も不要。

一度プログラミングをつくっておけば、
何かしらトラブルがなければ、
四六時中いっときも休まずに、勝手に情報を更新してくれます。

アオキ
プログラミングってめっさ便利ですね・・

ということで、天気予報の情報をとってくるプログラミングの方法を、今回は『PHP』で解説してみます。

Sponsored link

ホームページに天気予報を表示させる方法は2通り

ホームページに天気予報を表示させる方法は大きく2通りあります。

  1. APIを使用する
  2. Webスクレイピング(ホームページに表示されているデータの抽出

まず1の『API』というのは、

アプリケーションプログラミングインターフェースの略で、

今回の場合は天気予報のサイトが、外部サイトにもデータを提供できるようにしている仕組みのことです。

有名な天気予報関連のAPIとして、

  • OpenWeatherMap
  • WeatherUnderGround
  • Forecast
  • LiveDoor天気予報

などがあります。

参考記事

API利用の注意点として、

  • 商用で使う場合は有料だったり
  • 1日の無料アクセス回数が決まっていたり

します。

LiveDoor天気予報がいいかなと思ったのですが商用有料ということで断念。

OpenWeatherMapを検討したのですが、

表示させたい地域の天気予報がなかったこともあり、

今回はAPIを使うことは断念し、

2番目のWebスクレイピングでデータを抽出することにしました。

ホームページに天気予報を表示させるために「Webスクレイピング」

Webスクレイピングはホームページからデータを抜き取る方法。

どのホームページを使えばいいのかなと思いググってみると、

どうやら気象庁のWebデータは、2次利用OKということを発見。

アオキ
こりゃ決まりだね。

天気予報を表示させたい地域もあったので即決。

要望いただいたホームページはレンタルサーバーだったので、プログラム言語は迷わず『PHP』を選択。

※個人的にはWebスクレピングといえばPythonだと思ってますが、
いかんせんレンタルサーバーで動かすには向いていないので、
格安レンタルサーバーなら素直に『PHP』でいいと思います。

ググって、『phpquery』なるライブラリ(便利ツール)があることを発見。

ほとんどこの記事の通りに実施して天気予報の情報を収集することができました。

参考記事

phpqueryサイトからphpファイルをダウンロードして、

任意の場所において、『PHP』のinclude_once() 関数でファイルを読み込んで、

file_get_contents()関数で天気予報が掲載されているページのURLを読み込んで、

$html = file_get_contents("https://www.jma.go.jp/jp/yoho/334.html");

あとはphpQueryの使い方にあわせて、こんな感じでデータを出力すればOKです。

echo phpQuery::newDocument($html)->find("h1")->text();

深い階層にあるデータは、

グーグルクロムのデベロッパーツール「右クリックで検証、もしくはF12キー」

で確認しながら調整していくとOKです。

今回の場合はこういったコードになりました。

 echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("th.weather:eq(0)")->text();

最後の ->text() を省くと、HTMLが出力されるようです。

アオキ
天気予報と言ったらやっぱり晴れ・曇・雨のマークがいるっしょ

っと思い、画像も持ってくることにしました。

echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("th.weather:eq(0)")->find("img");

最後に ->text() が書かれていないので、HTMLのまま出力されるのですが、

画像は相対パスだったためそのままでは持ってこれず・・

よくよく画像ファイルのURLを見ると、

https://www.jma.go.jp/jp/yoho/img/201.png

といったURLだったので、最後の番号を101とか 203 とか推測しながら画像収集しました。
(まるっと取得できる方法もあったはずなので探しておきます。)

また、降水確率の箇所が 00-06時、06-12、12-18、 18-24、と記載があり、一行でつなげると流石に見づらかったので、

explode() 関数で、”%”の箇所で区切りつつ、%をつけつつ、
タグで改行させています。

今回の天気予報データの取得はこんなコードになりました。

<?php
  require_once("./phpQuery-onefile.php");
  $html = file_get_contents("https://www.jma.go.jp/jp/yoho/334.html");

  if(!isset($html)){

  }else{

  echo '<table class="weather_info">';

  echo '<tbody>';
  echo '<tr>';
  echo '<td></td>';
  echo '<td>';
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("th.weather:eq(0)")->text();
  echo '<br>';
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("th.weather:eq(0)")->find("img");

  echo '</td>';
  echo '<td>';
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("th.weather:eq(1)")->text();
  echo '<br>';
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("th.weather:eq(0)")->find("img");
  echo '</td>';
  echo '</tr>';

  echo '<tr>';
  echo '<td></td>';
  echo '<td>';
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("td.info:eq(0)")->text();
  echo '</td>';
  echo '<td>';
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("td.info:eq(1)")->text();
  echo '</td>';
  echo '</tr>';

  echo '<tr>';
  echo '<td>降水確率</td>';
  echo '<td>';
  $rain_0day = phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("td.rain:eq(0)")->text();
  $rain_array_0day = explode("%", $rain_0day);
  echo $rain_array_0day[0] . "%" . "<br>";
  echo $rain_array_0day[1] . "%" ."<br>";
  echo $rain_array_0day[2] . "%" ."<br>";
  echo $rain_array_0day[3] . "%" ."<br>";

  echo '</td>';
  echo '<td>';  
  $rain_1day = phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("td.rain:eq(1)")->text();
  $rain_array_1day = explode("%", $rain_1day);
  echo $rain_array_1day[0] . "%" . "<br>";
  echo $rain_array_1day[1] . "%" ."<br>";
  echo $rain_array_1day[2] . "%" ."<br>";
  echo $rain_array_1day[3] . "%" ."<br>";

  echo '</td>';
  echo '</tr>';

  echo '<tr>';
  echo '<td>気温予報</td>';
  echo '<td>';
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("td.temp:eq(0)")->text();
  echo '</td>';
  echo '<td>';  
  echo phpQuery::newDocument($html)->find("#base")->find("#main")->find("div")->find("#forecasttablefont")->find("td.temp:eq(1)")->text();
  echo '</td>';
  echo '</tr>';


  echo '</table>';

  }
?>

見た目はこんな感じ。

※CSSははしょってます。

もっと効率いい書き方があるとは思うけれど、

短時間でさくっとつくれるのは『PHP』の魅力かなと思います。

これで、ホームページを更新するたび、またはホームページにアクセスするたびに、

最新の情報を気象庁ページから自動で取得してくれるので、

毎回毎回天気予報のページを見に行く必要もなく、

とっても簡単に天気予報を表示させることができるようになりました。

Sponsored link

まとめ ホームページに天気予報を表示させるなら『プログラミング』を

Webスクレイピングの使い方を覚えれば、

天気予報に限らず、

  • 株価
  • ホテルの料金
  • Amazonの価格

など様々な情報を引っ張ってくることができるようになります。

APIが公開されていればAPIを使うことが最善なのですが、

欲しいAPIがない場合には、『Webスクレイピング』を使ってデータ抽出するのも手の一つかなと思います。

アオキ
どんどん楽して楽しいことに時間を使いたいですね。

今回のコードはこちらに上げておきます。

『PHP(Laravel)』ではこんな記事も読まれています。

1. 【PHP/Laravel】初心者向けの動画をリリースしました【Udemy】

2. 【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【techpit】

3. 【PHP】【Laravel】CSVエクスポートの方法〜5つのポイント〜

4. 【PHP】オブジェクトと連想配列の違いについて調べてみた【初心者向け】

5. 【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】

6. 【PHP】【図解】クラスと抽象クラスとインターフェースとトレイトとDIをまとめてみた【初心者向け】

7. 【PHP】配列や連想配列が覚えづらかったので学校に例えてみた【初心者向け】

8. 【PHP】ホームページに天気予報を表示させる方法【Webスクレイピング】【初心者向け】

9. 【Laravel】Webアプリ環境構築の仕方【Vue.js】【初心者向け】

10. 【PHP】2次元(多次元)配列でデータ取得したいならarray_columnがめっさ便利

アオキ
ツイッターでも記事ネタ含めちょろちょろ書いていくので、よろしければぜひフォローお願いしますm(_ _ )m

アオキのツイッターアカウント


関連記事一覧 (一部広告あり)

コメント

    • まりも
    • 2020年 6月 13日 4:44am

    すみません、誤字しました。

    webスクレイピングサイト→webスクレイピング

    • まりも
    • 2020年 6月 11日 8:23pm

    はじめまして。大変勉強になるHPを作っていただきありがとうございます。

    現在私はプログラミング初心者で、APIやwebスクレイピングを利用したサイトを作ろうと思っています。

    サイトはレンタルサーバーで稼働されることになると思いますが、その場合はやはり記事にあるようにpythonよりPHPがおすすめですか?
    Java scriptやRuby on railsは如何でしょうか?

      • aoki_monpro
      • 2020年 6月 12日 4:37am

      まりもさん、コメントありがとうございます。
      レンタルサーバーで運用となれば、PHPの方が簡単かなとは思います。
      RubyOnRailsはほぼ触ってないんですが、サーバー側で動くなら問題ないかと。
      JavaScriptはブラウザ側の言語になるため、APIが使えない場合(相手サーバーが許可していない場合)もあるので、使うAPI次第かなと思います。

        • まりも
        • 2020年 6月 13日 2:37am

        ご返信ありがとうございます。さっそくさきほどアオキ様のudemyのPHP+laravel講座を購入させていただきました。
        APIやwebスクレイピングサイトを利用したサイトをレンタルサーバーに作る場合も、PHP単体よりlaravelを使ったほうが効率が良いでしょうか?

          • aoki_monpro
          • 2020年 6月 13日 9:30pm

          ご購入ありがとうございます^^
          つくるサイト次第なんですが、
          ログイン機能を持たせたり、
          ページネーションつけたりするなら
          Laravelかと思いますが、
          まずはPHP単体でいいのではと思います。

            • まりも
            • 2020年 6月 16日 10:50pm

            ありがとうございます、PHP単体のほうでまず作ってみます。

            さっそくアオキ様の教材で勉強しておりますが、とてもわかりやすいです。

            素晴らしい教材を作っていただきありがとうございました!!

            • aoki_monpro
            • 2020年 6月 17日 4:58am

            ありがとうございます^^

            講座の知識 + phpQuery の説明記事をいくつか調べて読んでいただくと
            簡単なAPI, webスクレイピングサイトは作れると思うので、ぜひ頑張ってください^^

  1. この記事へのトラックバックはありません。

CAPTCHA


最近の記事

アーカイブ

  1. オンライン教材

    ChatGPTをビジネス活用する講座をリリースしました【Udemy】
  2. データベース

    MySQLの講座をリリースしました
  3. 生成AI

    Dify講座をリリースしました【非エンジニア向け】
  4. バックエンド

    【Laravel第4弾】Vue.js3(CompositionAPI+Scrip…
  5. オンライン教材

    【ChatGPT】エンジニア編をリリースしました
PAGE TOP
Ads Blocker Image Powered by Code Help Pro

広告ブロックを摘出しました!!

ブラウザ拡張を使用して広告をブロックしていることが摘出されました。

ブラウザの広告ブロッカーの機能を無効にするか、
当サイトのドメインをホワイトリストに追加し、「更新」をクリックして下さい。

あなたが広告をブロックする権利があるように、
当方も広告をブロックしている人にコンテンツを提供しない権利と自由があります。

Powered By
100% Free SEO Tools - Tool Kits PRO