はじめに
友達との作品制作で空港の情報が欲しくなった時にスクレイピングしてみようと思い
下記のサイトさんがたくさんの情報が載っていたのでスクレイピングしようと思いました。
https://www.airlineguide.jp/airport-codes/
PHPやLaravelは初心者でいろんな方の記事を参考にさせていただきました
Laravel/Goutteで映画タイトルをクローリングする
利用するものとしては友人がLaravelを使用していたのでそれに合わせました
※スクレイピングについては色々あると思うので自己責任でお願いします。
Laravelのバージョンは5.5.45です
スクレイピングとは
スクレイピングはサーバサイドのプログラミング言語を使って外部サーバへアクセスし、そのコンテンツから自分たちの欲しい情報を引き出す手法です。多くはHTMLを返す場合に使われ、DOMを解析したり正規表現を使ってデータを抜き出します。
引用(スクレイピングとAPIの違い)
取得した情報
- 空港コード
- 空港名
の三つの情報が欲しいのでサイトをみてみます
画像内のテーブルタグに囲まれた
- 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とかで国コードを挿入するためです