エックスサーバーでPython3を利用した環境構築の方法です。
PythonつかってAPI経由でWEBスクレイピングできる仕組みをつくったのはいいけど
会社で利用しているサーバーがエックスサーバーで、そのままではFlaskだったり必要なフレームワークが入ってないみたい。
色々ググってみて調べつつ、やっとことさ環境はできました。
調べてみて沢山の紹介サイトはあったけど、「WEBスクレイピング」、「Flask」どちらかっていうのがほとんど
WEBスクレイピング+Flaskって環境構築の方法がなかったので、まとめてみました。
##環境
今回紹介する環境は以下の通りです
エックスサーバービジネス(多分普通のエックスサーバーでも大丈夫)
Python 3.7.3
Flask 1.0.2:WEBアプリケーションフレームワーク
beautifulsoup4:HTMLパーサー
requests:HTTP ライブラリ
lxml: HTMLパーサー(beautifulsoup4でつかう)
そもそもエックスサーバーは共有レンタルサーバーだからroot権限はもてません
なので/etcへのアクセス権がありません。
色んなサイトで、方法がバラバラだったけど一番しっくりきた「Linuxbrew」を使った方法をためします。
##Linuxbrewの環境を構築
インストールとか必要なのでエックスサーバーにはSSHでログインします。
詳細はエックスサーバーのマニュアルをみてください。
基本的にLinuxbrewの公式サイトをみて、その通り実行していきます。
Paste at a terminal prompt:
って書いてあるので下記を貼り付けます。
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
パスワードを求められますが、rootのパスワードは無理なので、そのまま無視してEnterで続けるとインストールが開始されます。
(自分のルートディレクトリに環境がインストールされているのだと信じることにする)
インストールは不安になるくらい、長いこと待ちます(20分くらいかなぁ)・・・
インストールが完了すると、PATHの設定をしてほしそうなメッセージがでるので設定します。
結論から言うと下記のコード1行づつ実行します。
test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
公式ページにはもう1行あって、別の紹介サイトでは全部実行するみたいに書いてあったけど、やったらダメです。
PATHがクルって、lsすら見失います。公式ページにはちゃんと書いてあります。
Follow the Next steps instructions to add Homebrew to your PATH and to your bash shell profile script, either ~/.profile on Debian/Ubuntu or ~/.bash_profile on CentOS/Fedora/RedHat.
CentOSは.bash_profileにPATH通してね!って
(ちなみに、わたしの環境はCentOSでした、他のエックスサーバーの環境は不明ですが、おそらくRedHat系でしょう)
最後に確認で下記を実行します。エラーとかでなければインストールOkです。
brew install hello
##Pythonの環境を構築
まずはPythonのインストール現時点でのエックスサーバーデフォルトのPythonのバージョンはは3.4.2でした。
最新を入れたかったので、LinuxbrewでPythonをインストールします。
brew install python3
とりあえず、バージョンチェック
python3 -V
Python 3.7.3 がでました。
###スクレイピングの環境
では、スクレイピングに必要な環境を作っていきます。
pipで必要なライブラリをインストールします。
pip3 install BeautifulSoup4
pip3 install requests
pip3 install lxml
BeautifulSoup4がちょっと時間がかかった気がしますが、ほかはすぐインストール完了します。
###FlaskでWEBアプリケーションの環境
Pythonには仮想環境構築用に「Pipenv」というのがあります。
なので、PipenvでFlaskをインストールします。
まずはPipenvをインストールします。
brew install pipenv
次に、環境を作りたいディレクトリに移動して、
pipenv install flask
これでflaskの環境もOK!
の
はずが・・・(¯―¯٥)
このまま進めてファイルをアップロードしたりしたのですが、全然動かず
結果、、、よくわからないままとりあえず普通の「pip」つかってFlaskをインストールしました。
ついでに**CORS (Cross-Origin Resource Sharing)**の環境もいれておきます。
pip3 install flask
pip3 install flask-cors
##ファイルをアップロードして動作を確認
エックスサーバーではindex.cgiを起点にして、WEBアプリケーションを実行させるようなので.htaccessで制御します
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]
RewriteRuleはpublic_html以下のサイトごとのルートディレクトリの場合の書き方です。
サブディレクトリ以下に環境を作る場合はindex.cgiの前にディレクトリ名を入れておきましょう。
次にindex.cgiです。
参考にしたサイトは、ソースに対してあまり説明がなかったので、最初全然うまく行きませんでした。
#!/home/[サーバー名]/.linuxbrew/bin/python3
from wsgiref.handlers import CGIHandler
from [ファイル名] import [アプリケーション名]
CGIHandler().run([アプリケーション名])
[サーバー名]:自分のエックスサーバーのサーバー名を入れてください。
[ファイル名]:スタートページのファイル名
[アプリケーション名]:定義しているWEBアプリケーション名
ちょっとわかりにくいので下のサンプルコードの場合のindex.cgiも書いておきます。(サーバー名はtestserver)
#!/home/testserver/.linuxbrew/bin/python3
from wsgiref.handlers import CGIHandler
from test import app
CGIHandler().run(app)
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "Hello world!"
test.pyもアップロードしたら
最後にパーミッションの設定を行います。
エックスサーバーはCGIを動かせるパーミッションが決まっているので
index.cgiとそれが置かれているディレクトリに755のパーミッションをあってましょう。
あとはブラウザで、URLにアクセスしましょう。
Hello world!がでてくればOKです。
(スクレイピング自体のサンプルは全然ないですが、環境はできているのでソース置いたらちゃんと動きますよ。)
なんだかflaskが2つはいったみたいで気持ち悪い感じです
結果Linuxbrewも必要なかったのではないかと疑問もあるが
一応動く環境もできたし、OKとします。
AWSとかでゼロから作ったほうが、もっと自由にできて楽だったのになぁ。。。
※ちょいと補足
index.cgiの1行目Pythonのパスは、SSHでログインしたあとにで一度確認しておいたほうがいいです。
which python3
~/.linuxbrew/bin/python3
になっていればOKです。(~/はサイトのルートディレクトリ)
2019/09/24補足
そもそもの話ですが、エックスサーバーのWEBサーバーは「nginx」です。「Apache」ではないので、途中あれっ?
と感じた方いると思いますが
index.cgiとかの設定が入っているのはそのせいです。