herokuとFlaskとデータベースとseleniumとphonotomJS
忘れないうちにメモしておく。少し雑。
目次
heroku
heroku(Official)はPythonを含めた多様な言語のWebアプリをデプロイできるPaaSだ。 公式の通りにやればHelloWorldのデプロイまでは簡単にできる。(仮想環境は必須だが。)
Flask
FlaskはPythonで使えるWebフレームワーク。シンプルさが売りらしい。
herokuとデータベース
データベースを使うこともできる。次の参考はFlaskでのデータベース操作が詳しい。Part IからIVまで読めば、データベースについてはだいたいわかる。
The Flask Mega-Tutorial, Part IV: Database - miguelgrinberg.com
しかし、開発環境と本番環境などで、切り替えが面倒。そこで、config.pyをプロジェクトのルートに作って、そこで起動時にapp.config
に読み込むようにする。以下のようなconfig.py
を作り、
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')
PHANTOMJS_PATH = 'phantomjs'
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
PHANTOMJS_PATH = os.environ.get('PHANTOMJS_PATH')
class DevelopmentConfig(Config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
# Alias
config_list = {
'development': 'config.DevelopmentConfig',
'production': 'config.ProductionConfig',
'testing': 'config.TestingConfig',
}
def configure_app(app):
# Specify config to load
config_name = 'development' if not os.environ.get('DATABASE_URL') else 'production'
app.config.from_object(config_list[config_name])
print(f'Configured as {config_name}.')
app = Flask(__name__)
するところのすぐ後でconifg.configure_app(app)
を読み出すようにする。環境変数から環境を判断するようになっているが、ここは任意の方法でいい。
なお、app = Flask(__name__)
は、依存関係のループを避ける為、app
モジュールの__init__.py
で行っている。
本番環境ではpostgresql
を使うので、pip install psycopg2
で内部で必要になるpsycopg2
を準備しておくこと。
herokuとseleniumとphantomJS
seleniumは本来Webアプリなどの為のWebブラウザを動かすテスト用ツールだが、とても便利でスクレイピングにも使える。phantomJSはGUIの無いWebブラウザだ。この2つを使用して、heroku上で動かす。
selenium自体はPythonでは、pip
で用意できる。phantomJSはローカルではbrew
で用意できるが、本番環境のherokuでは、違う方法で用意する必要がある。
公式のダウンロードページ(Download | PhantomJS)からLinux 64bit版をダウンロードしてプロジェクトのbin/
フォルダに入れておく、という方法をとった。手順は次のように。
- Linux 64bit版をダウンロード
- 圧縮されているので解凍
- 解凍した中にある
bin/
にバイナリがあるので、それをプロジェクトのルートのbin/
にコピー - gitの管理下に置く
- 先ほどの
config.py
でローカル用のpathと本番用のpathを区別する。- 上の
PHANTOMJS_PATH
の部分が該当
- 上の
- herokuに環境変数を追加
heroku config:set PHANTOMJS_PATH=bin/phantomjs
今までスクレイピングにはPyQueryを使っていた。今回も途中までは使っていたが、スクレイピングしたいページがJavaScriptでロードする仕様になっていたため、PyQueryでは対処できなかった。(自分の知る限り)
seleniumではWebブラウザの動きをそのまま再現するので、クリックやページ遷移、Scriptの作動など幅広くできる。 一方で見える範囲しか要素をいじれないので、少し不便な面もあると感じた。
適材適所で使いわけよう。
コメント