エックスサーバーでPython3使ってAPI経由でWEBスクレイピングできる環境構築

エックスサーバーで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でログインします。
詳細は[エックスサーバーのマニュアル](https://www.xserver.ne.jp/manual/man_server_ssh.php)をみてください。

基本的に[Linuxbrewの公式サイト](https://docs.brew.sh/Homebrew-on-Linux)をみて、その通り実行していきます。

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で制御します

```file:.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]
```
RewriteRuleはpublic_html以下のサイトごとのルートディレクトリの場合の書き方です。
サブディレクトリ以下に環境を作る場合はindex.cgiの前にディレクトリ名を入れておきましょう。

次にindex.cgiです。
参考にしたサイトは、ソースに対してあまり説明がなかったので、最初全然うまく行きませんでした。

```index.cgi
#!/home/[サーバー名]/.linuxbrew/bin/python3 
from wsgiref.handlers import CGIHandler
from [ファイル名] import [アプリケーション名]
CGIHandler().run([アプリケーション名])
```
[サーバー名]：自分のエックスサーバーのサーバー名を入れてください。
[ファイル名]：スタートページのファイル名
[アプリケーション名]：定義しているWEBアプリケーション名

ちょっとわかりにくいので下のサンプルコードの場合のindex.cgiも書いておきます。(サーバー名はtestserver)

```index.cgi
#!/home/testserver/.linuxbrew/bin/python3 
from wsgiref.handlers import CGIHandler
from test import app 
CGIHandler().run(app)
```

```test.py
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とかの設定が入っているのはそのせいです。