Pythonを解説をみながらようやくローカル環境で実行することができるようになりましたが、こうなるとサーバー上でも動かしてみたくなります。エックスサーバーでもPythonを使うことはできるけれどもpipは使えません。root権限がないのでエラーメッセージが出ます。これだとbeautifulsoupなどをつかってスクレイピングライフを満喫することができません。
Contents
Linuxbrewではうまくいかない?
そこでroot権限がないならホームディレクトリにインストールできないかを考えます。
SSHでサーバーに接続
まずSSHでサーバーに接続します。公式サイトの説明をみながら進めていきます。
SSHソフトの設定(Tera Term) | レンタルサーバーならエックスサーバー
問題はここから。古い記事だとLinuxbrewをインストールしてそこからPythonをインストールする方法が紹介されていますが、これをやろうとしてもうまくいきません。
まずLinuxbrewをインストールしようとして書いているとおりに
1 2 |
# これだとうまくいかない $ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)" |
を実行しても
1 2 3 |
Warning: Linuxbrew has been merged into Homebrew. Please migrate to the following command: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" |
と表示されるだけ。LinuxbrewはHomebrewに統合されたのでHomebrewをインストールしろと言われます。そしてHomebrewをインストールしてPythonをインストールしようとすると今度はcurlとgitをアップデートしろというエラーが出る。そしてcurlをアップデートしてPythonをインストールしようとすると今度はhttpsが使えないというエラーメッセージが・・・。結局どうやってもできませんでした。
しかたがないので別の方法をとります。
Minicondaを使う
エックスサーバーで簡単にpythonのpipとFlaskの環境を構築するによるとanacondaを使うとよいそうです。そしてこの方法ならできました。
まずはMinicondaをインストール。ここからMiniconda3-py38_4.8.3-Linux-x86_64.shを探してダウンロードし、FFFTPでホームディレクトリにアップロードします。そのあと
1 2 |
# Minicondaをインストールする sh Miniconda3-py38_4.8.3-Linux-x86_64.sh |
これでMinicondaのインストールが始まります。
1 2 |
Please, press ENTER to continue >>> |
と表示されたらEnterキーをおします。
次にライセンス条項が表示されます。1行ずつ表示されるのでEnterキーを押し続けます。するとライセンス条項に同意するかどうかを問われるのでyesを入力してEnterキーをおします。
1 2 |
Do you accept the license terms? [yes|no] [no] >>> yes |
すると下のように表示されるのでEnterキーを押します。
1 2 3 4 5 6 7 8 |
Miniconda3 will now be installed into this location: /home/*****/miniconda3 - Press ENTER to confirm the location - Press CTRL-C to abort the installation - Or specify a different location below [/home/*****/miniconda3] >>> |
続いて以下のような表示がされるのでyesと入力してEnterキーを押します。
1 2 3 |
Do you wish the installer to initialize Miniconda3 by running conda init? [yes|no] [no] >>> yes |
最後にパスを通すために
1 2 |
# パスを通すために必要 source .bashrc |
と入力してEnterキーを押します。
MinicondaをインストールしたらPythonとpipが使える
このあとエックスサーバーで簡単にpythonのpipとFlaskの環境を構築するではPythonのインストールをするように書いていますが、
1 2 |
# インストール済み一覧を表示させる conda list |
とタイプするとなにもしなくてもこのままの状態でPython3.8とpipが使える状態になっていることがわかります。
試しにwhich pythonとかwhich pipと入力して実行してみましょう。以下のような表示がされ、Pythonとpipがminiconda3のなかにインストールされていることがわかります。
1 2 |
~/miniconda3/bin/python ~/miniconda3/bin/pip |
ためしにbeautifulsoupをインストールしてみます。そのあと以下のコマンドでどこにインストールされたか調べます。
1 2 3 4 5 |
# beautifulsoupをインストール pip install beautifulsoup4 # どこにインストールされたか調べる pip show beautifulsoup4 |
すると
1 2 3 4 5 6 7 8 9 10 |
Name: beautifulsoup4 Version: 4.9.3 Summary: Screen-scraping library Home-page: http://www.crummy.com/software/BeautifulSoup/bs4/ Author: Leonard Richardson Author-email: leonardr@segfault.org License: MIT Location: /home/XXXX/miniconda3/lib/python3.8/site-packages Requires: soupsieve Required-by: |
と表示されます。うまくいっているようです。
Pythonで書かれたプログラムを動かしてみる
ではPythonでプログラムを作成して実際に動くかどうか試してみましょう。
index.pyを作成して以下を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#!/home/XXXXXX/miniconda3/bin/python3 XXXXXXは自分のサーバーID # -*- coding: utf-8 -*- import urllib.request from bs4 import BeautifulSoup # 日本語を扱うために必要な設定 import sys sys.stdin = open(sys.stdin.fileno(), 'r', encoding='UTF-8') sys.stdout = open(sys.stdout.fileno(), 'w', encoding='UTF-8') sys.stderr = open(sys.stderr.fileno(), 'w', encoding='UTF-8') # HTMLヘッダ出力 print("Content-type: text/html; charset=utf-8\r\n\r\n") # Yahoo Japanのトップページにアクセス url = "https://www.yahoo.co.jp/" data = urllib.request.urlopen(url) # HTMLを解析して取得 soup = BeautifulSoup(data, 'html.parser') # リンクの部分のみ取り出す items = soup.find_all('a') # HTMLタグ出力 print("<!DOCTYPE html>") print("<html>") print("<head>") print("<meta charset='utf-8'>") print("<meta name='viewport' content='width=device-width,user-scalable=yes'>") print("<link rel='stylesheet' href='style.css'>") print("<title>Yahoo Japanのリンク部分だけ取得してみる</title>") print("</head>") print("<body>") print("<h1>Yahoo Japanのリンク部分を取得してみる</h1>") endPoint = len(items) print("<ul>") for a in items: print('<li><a target="_blank" rel="noopener">') print(a.text) print('</a>') print("</li>") print("</ul>") print("</body>") print("</html>") |
.htaccessの設置とパーミッションの設定
これを適当な場所にアップロードします。そしてパーミッションを755または705に設定します。ここを間違えると500エラーとなって動いてくれません。
そしてアップロードのと同じディレクトリに以下の.htaccessファイルをアップロードします。パーミッションは644とします。
1 2 |
DirectoryIndex index.py indexhtml AddHandler cgi-script .py |
1行目は、index.pyというファイル名の場合、URL入力のとき省略可能という意味で、2行目は、拡張子が~.pyのファイルをCGIプログラムとして認識するための記述です。
実際にhttps://lets-csharp.com/samples/2108/python-test/にアップロードしているので確認してください。それからYahooをGoogleに変更しただけでhttps://lets-csharp.com/samples/2108/python-test/test.pyも作成してみました。スラッシュエンドでなくてもうまく動作しています。
Node.jsも使える?
それからNode.jsも同じようにインストールしてみました。こちらはNodebrewでNodeをインストールします。curlが使えないならwget と perl の組み合わせという技があります。これでダウンロードとインストールをしてしまいます(ネタ元 ⇒ xserver に nodejs インストール)。
1 2 |
wget git.io/nodebrew perl nodebrew setup |
インストール完了したらパスを通します。
1 2 3 4 5 |
# パスを通す echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc # そのあと以下を実行 source ~/.bashrc |
このままでは空っぽなのでNode.jsをインストールします。
最新のものであれば
nodebrew install latest
安定版であれば
nodebrew install stable
複数インストールできます。そして
nodebrew list
とすればインストールしたパッケージ一覧を見ることができるので
nodebrew use v14.2.0
などと使いたいバージョンのものを選択します。
実際に動かしてみる
index.jsでコードを書きます。ユーザーエージェントを表示するだけの簡単なプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 |
const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.write(req.headers['user-agent']); res.end(); }); const port = 65000; server.listen(port, () => { console.log('Listening on ' + port); }); |
root権限がないので80でリッスンすることができません。そこで65000を使います。
実行するにはindex.jsをアップロードしたディレクトリに移動して
1 2 |
# 次にdisownコマンドを使いたいのでバックグラウンドで実行する node index.js & |
SSHを切断したあとも表示させつづけるためには最後に&をつけるのがポイントです。そのあといったんCtrl+Cを押します。そのあと
1 2 |
# SSHを切断したあとも終了させない disown |
を実行します。
.htaccessでページが表示されるようにする
それからレンタルサーバーの場合、使用できるポートが限定されています。ブラウザで表示させることができないので.htaccessを使います。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ http://localhost:65000/$1 [P,L] </IfModule> |
要は.htaccessを設置したディレクトリにアクセスがきたらhttp://localhost:65000の内容を表示させるのです。
https://lets-csharp.com/samples/2108/nodejs-test/から確認できます。
終了させるときは
終了させるときは以下のコマンドを実行してでてきたものをkillすればいいのですが、これでは複数起動しているときにどれがどれかわからなくなります。
1 2 |
ps -e | grep node | awk '{print $1}' kill -9 XXXX |
そこで以下のようにポート番号を指定して65000を使用しているPIDを調べます。そのあとkillします。
1 2 |
lsof -i:65000 kill -9 XXXX |
[…] […]