13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-24

エックスサーバーで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で制御します

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

13
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?