ポケモン全然詳しくないので、もっと詳しくなろうという気持ちが強くて
Pokédex
みたいなものでも作ろうかと思った。
ここ で見られる。
最も重いポケモンは 999.9kg ですね。
スクレイピング
まずはスクレイピングで必要なデータを取得。
requests
を使うのはもはや常套手段ですが、今回は asyncio
と aiohttp
を使って非同期スクレイピングを行う。
画像は ポケモンずかん で取得、
他は PokéAPI という RESTful API を使って、必要な情報を JSON ファイルとして保存。
asyncio と aiohttp について、以下は画像収集の例となる。
全ポケモンはかなりの量なので、semaphore を使って、リクエスト数を制限する。
テーブルとしてレンダリング
データ収集完了後、さっさと綺麗に表示されたいなら、DataTables という jQuery プラグインを使うのが便利です。
サーバ側からデータを取得したいので、Server-side processing を使用する。
画像は columnDefs
の設定によって表示される。
サーバ側は Pandas を使って、JSON データを DataFrame
として読み込ませる。
Pagination、検索、ソートを自ら処理することが必要です。
DataTablesから送信した query string
order[0][column]: 0
order[0][dir]: asc
start: 0
length: 10
search[value]:
search[regex]: false
- start と length は Pagination に対応。
- search[value] は検索で、search[regex] を true にすれば、正規表現でも使える。
- order[0][column]: 並べ替える列のindex
- order[0][dir]: asc か desc
Flask と Pandas で処理すると、こんな感じ。
デプロイ
uWSGI + Nginx でデプロイする。
で、uWSGI と Nginx の設定が終わって、動いてみたら、
502 Bad Gateway
が出た。
Nginx のエラーログ /var/log/nginx/error.log
を見ると、
[error] 124922#124922: *6 recv() failed (104: Connection reset by peer) while reading response header from upstream
uWSGI との通信で何か問題が発生したみたいです。
原因は uWSGI の buffer-size はデフォルト値 4096 になったので、uWSGIの設定ファイル uwsgi.ini で buffer-size を設定する必要がある。