ポケモンの各種データをスクレイピングしてRest API化してみる

ポケモン関連のAPIって結構色んな方が無料提供してくれてます。

が、自分専用にカスタマイズしたいし、他人提供のAPIはいつ無くなるか分かりません。

ちょうどその時期、CakePHP3を現場で使っていたので、勉強がてらに利用してみました。

概要

ある程度短期的なゴールを設定しないと、終わりがないのでまずはここらへんがターゲット。

・基本情報系API(名前・属性・特性・種族値・覚える技)

・技系API(技の概要・威力・内容等)

・特性系API(特性の概要・効果等)

・対戦用育成済み系API

これらをJSONで提供するAPIを作りますが、やることは以下になります。

・環境構築

・SwaggerでAPI定義

・スクレイピング

・APIでのCRUD操作

・最低限の単体試験

3番目のスクレイピングが少し面倒でしたね。

環境構築

ローカル環境にcomposerが導入済みで、パスが設定されていること前提。

MAMPで開発していたので、データベースはMySQLを利用。

開発環境は以下の通り。

・PHP7.19

・CakePHP3.69

・MAMP

・MySQL5.6

SwaggerでAPI定義

現場でAPI定義をswagger使っていたので、今回も利用します。

swagger-uiでyamlファイルを読み込み、とりあえずGithubで公開。

ポケモンのRest-APIをswagger-uiで可視化してgithub pagesで公開

Goutteスクレイピング

コレが一番面倒で時間がかかりました。

今回スクレイピングは、Goutteを使ってみました。

採用理由は簡単に導入出来るから(安易)

ポケモンの基本情報(名前と属性)のスクレイピングはこんな感じ。

TaNA
複数サイトをスクレイピングしましたが、スクレイピング自体も結構グレー?らしく、過度なアクセスがちょっと怖い。なので何度もアクセスしなくてすむように、Commandクラスでsqlファイル出力し、足りないデータは手で作りました。

スクレイピングしたデータ

まあスクレイピングは綺麗に一回で収集するのは難しく、何やかんや泥臭い作業も多い。

JSONレスポンスを返すAPI

DBに対してのCRUD操作なので全然たいした事やってないので、ソースは省略します。

取得した結果はJSONで返すように実装。

趣味レベルの開発ですが、単体試験も最低限実施。

Controller → レスポンス200が返ってくるか

Model → 正しくDB処理される/trueが返ってくる

Tabel → 正しくバリデーションされている

コントローラ系はこんな感じでやってます↓

CakePHP3.6のコントローラでのPHPUnitの使い方メモ

今後の展望

今回は最低限の機能のみを実装したので、よりレート対戦で役立つAPIを実装。

+αでこれらAPIを使うための画面側をReactあたりでSPA化。

あとは2019年にNintendo Switchで新作(第8世代)が発売されるので、それに向けたメンテですかね。