1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Goutteで空港情報を取得してみる

Last updated at Posted at 2020-01-13

はじめに

友達との作品制作で空港の情報が欲しくなった時にスクレイピングしてみようと思い

下記のサイトさんがたくさんの情報が載っていたのでスクレイピングしようと思いました。
https://www.airlineguide.jp/airport-codes/

PHPやLaravelは初心者でいろんな方の記事を参考にさせていただきました

Laravel/Goutteで映画タイトルをクローリングする

Goutte(PHP)でスクレイピングしてみる

利用するものとしては友人がLaravelを使用していたのでそれに合わせました

※スクレイピングについては色々あると思うので自己責任でお願いします。

Laravelのバージョンは5.5.45です

スクレイピングとは

スクレイピングはサーバサイドのプログラミング言語を使って外部サーバへアクセスし、そのコンテンツから自分たちの欲しい情報を引き出す手法です。多くはHTMLを返す場合に使われ、DOMを解析したり正規表現を使ってデータを抜き出します。
引用(スクレイピングとAPIの違い)

取得した情報

  • 空港コード
  • 空港名

の三つの情報が欲しいのでサイトをみてみます

スクリーンショット 2020-01-13 23.59.25.png

画像内のテーブルタグに囲まれた

  • 1つ目 空港コード
  • 3つ目 空港名 OR 3つ目の項目が空なら4つ目の項目を取ろうと思います

controller

AirPortController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Goutte;
use Illuminate\Support\Facades\DB;

class AirPortController extends Controller
{
    //
    public function index(){
        $url = 'https://www.airlineguide.jp/airport-codes/';

        $airCode = array();
        $count = 0;

        $crawler = Goutte::request('GET', $url);
        $crawler->filter('table tr')->each(function($node) use(&$airCode,&$count) {

            if(count($node->filter('td'))){
                //空港コード
                $airCode[$count]['code'] = $node->filter('td')->eq(0)->text();
                //空港名
                if($node->filter('td')->eq(2)->text() === ''){
                    $airCode[$count]['airPort'] = $node->filter('td')->eq(3)->text();
                }else{
                    $airCode[$count]['airPort'] = $node->filter('td')->eq(2)->text();
                }
                $count++;
            }

        });

        //DBに空港情報登録
        foreach ($airCode as  $value){
            DB::table('airports')->insert(['airport_code' => $value['code'],
                'airport_name'=> $value['airPort']]);
        }

    }
}

ルーティング

web.php
Route::get('/search','AirPortController@index');

結果

無事

  • 空港コード
  • 空港名

が取得できました

一つ空白の項目があるのは後からAPIとかで国コードを挿入するためです

スクリーンショット 2020-01-13 23.57.05.png
1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?