ロリポップのWEBサーバーにて様々なPythonモジュールをインストールし、CGIにてWEB上で動かす方法

目的

ロリポップのWEBサーバー上でPythonのBeautifulSoup4やyfinanceなどのモジュールを動かそうとしたが、うまく動作せず大変苦労したので、導入方法をこちらに記載します。

ロリポップのハイスピードプランを使用しています。

pipをインストールする

まず初めにpipをインストールする必要があります。

pipをインストールするにはコマンドプロントやPowerShellにてSSH接続を行う必要がある。

ロリポップの管理画面を開き、「サーバーの管理・設定」から「SSH」のページを開く。

画面からSSHを有効にする。

その後コマンドプロントを開いて、SSH接続を行う。

「SSH」のページで接続ポート、アカウント、サーバーの値を確認し、

ssh -p 接続ポート アカウント@サーバー

の形式で入力する。

ssh -p 接続ポート アカウント@サーバー password:

と表示されるのでSSHパスワードを入力する。

ここのpasswordは入力しても、文字が表示されない仕様なので、驚かないように注意してほしい。

SSH接続ができたらpipをインストールする。

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --user

次にPATHを通す必要があります。

pwdと入力し、ファイルの階層(/home/users/番号/ユーザー名)がでてくるのでそれ確認する、その階層は直後に入力することになる。

次に

vi .bash_profile

と打ち込んで、vimを開始し、PATHを通す。

~がたくさん出てくるので~の上のほうに

PATH=$PATH:/home/users/番号/ユーザー名/.local/bin
export PATH

と入力

ESCを押した後、「:wq」と打ち込むと~の下に文字が入る。
正しく~の下に:wqが入ったことを確認したらEnterを押す。

source .bash_profile

と入力する。

pipがインストールできたか確認してみましょう。

pip3 list

これでモジュールの一覧が表示されれば問題なし。

必要なモジュールのインストール

BeautifulSoup4やyfinanceなどの欲しいモジュールをインストールする。

pip3 install BeautifulSoup4 yfinance

無事インストールされるはずです!

しかし、このままではそれらのモジュールをインポートすることができません。

というのもロリポップのOpenSSLはOpenSSL 1.0.2k-fips 26 Jan 2017というものを使用しており、それが互換性の問題でurllib3モジュールを動作できなくしているのだ。

この問題を解決するために、urllib3をダウングレードする必要がある。

pip3 uninstall urllib3
pip3 install urllib3==1.26.18

これにてBeautifulSoup4やyfinanceなどのモジュールが問題なく動作するはずだ。

備考

モジュールがインポートできず500エラーが表示される場合、下記のコードでimportの箇所を覆うことでエラーの原因を表示することができる。

#!/usr/local/bin/python3.7
# -*- coding: utf-8 -*-

print ("Content-Type: text/html; charset=utf-8\n\n")

import traceback

try:
  # 処理内容
  from bs4 import BeautifulSoup
except Exception as e:
  # エラー処理
  error_message = traceback.format_exc()
  print(error_message)

CGIファイルを作成

ロリポップはpythonファイルをそのままCGIとして表示することができる。

CGIファイルを表示させるのにもいくつものトラップが存在する。

まず改行はLFで行われないとエラーとなるので、メモ帳等で編集するのは危険である。

以下はBeautifulSoup4が機能するかテストするためのコードです。

こちらをpyファイルで保存し、FTPでアップロードしてください。

パーミッションは755です。

#!/usr/local/bin/python3.7
# -*- coding: utf-8 -*-

# エラー時に不具合箇所を表示
import cgitb
cgitb.enable()

print ("Content-Type: text/html; charset=utf-8\n\n")

import requests
from bs4 import BeautifulSoup


# ウェブサイトのURLを指定
url = "https://www.google.com/"

# リクエストを送信してレスポンスを取得
response = requests.get(url)

# レスポンスのステータスコードを確認
if response.status_code == 200:
  # レスポンスが成功した場合
  print("Beautiful Soup 4 は正常に動作しています。")

  # HTMLコンテンツを解析
  soup = BeautifulSoup(response.content, 'html.parser')

  # タイトルタグのテキストを取得して表示
  title = soup.find('title').text
  print(f"タイトル: {title}")
else:
  # レスポンスが失敗した場合
  print(f"Beautiful Soup 4 の動作確認に失敗しました。 ステータスコード: {response.status_code}")

文字コードはファイル自体の文字コードとWEBサイト上の文字コードを両方していしないと正しく表示されない。(# -*- coding: utf-8 -*-と charset=utf-8)

cgitbやtracebackモジュールのコードを入れることでエラー発生時に500エラー画面ではなく、エラーの原因が表示されます。つまりデバッグの結果が画面に表示されるというわけです。

アップロードができたら、pyファイルをURLから指定して、開くと動作するはずです。

コメント

タイトルとURLをコピーしました