共用レンタルサーバーで python アプリ

パクリ7発目

パクリ元

内容

EC2 の安いインスタンスを docker を使ってさらに環境を分けていたのだが、さすがに重すぎて何もできなくなってきた。円安進行のせいで AWS 料金ひどいことになってて高いインスタンスに移行するのも考えモノ。そこで今は未使用だけど年払い済みのために使用可能な、FTP しか許されていない共用レンタルサーバーで python が使用できることを知り、EC2 の環境をマネできないか検討してみた。

問題はいくつかあって、php だとブラウザで普通にアクセスできるのに python だとソースがそのまま表示される点。WEBサーバーからは python 連携されてなさそうなので、.htaccess に AddHandler cgi-script .py 入れてみたけどダメ、レンタルサーバーコントロールパネル上の cron から実行してみたら python 自体は動いているのを確認。

もう一つが python だと数値計算等のライブラリをインストールして高度な処理を行うものが多いが、共用レンタルサーバーでは自由にインストールできないこと。pip でインストールしたライブラリ群を、Laravel のように vendor フォルダに放り込んでレンタルサーバーにアップロードすることで使うようにできないのか、

そこでパクリ元記事。
Vendoring なんて言葉を知らなかったのでたどり着くのにもたついてしまったがこれさえあれば pip でインストールする python ライブラリであれば FTP しか許可されていなくてもたいていのものが使えるのではないかと思う。

応用

mysql はたいていのレンタルサーバーで使用できるので、スクレイピングして mysql に保存するものを考える。

以下はローカル linux 環境で行う作業。

┣━ main.py
┗━ vendor
  ┗━ requirements.txt

という構造を取ることとして requirements.txt には以下を記述する。

requests==2.22.0
beautifulsoup4==4.11.1
PyMySQL==1.0.2

vendorフォルダにライブラリをインストールする。

$ cd vendor
$ pip install -t . -r requirements.txt -U

main.py は以下のようにして、vendorフォルダとともにサーバーにアップロードする。

# vendorフォルダが使えるように
import os
import sys
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
PROJECT_VENDOR = os.sep.join([PROJECT_ROOT, 'vendor'])
sys.path.insert(0, PROJECT_VENDOR)

# 使用ライブラリ
import requests
from bs4 import BeautifulSoup
import pymysql.cursors

# PyMySQL
connection=pymysql.connect(host="ホスト名", user="ユーザー名", password="パスワード" , cursorclass=pymysql.cursors.DictCursor)
cursor=connection.cursor()
cursor.execute("USE データベース名")
connection.commit()

# スクレイピング
url = "https://*****"
r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
name_list = soup.select("div.name")

# DB保存
for name in name_list:
    cursor.execute('insert into nametable(name) values (%s)', name)
connection.commit()

# 片付け
cursor.close()
connection.close()

上記 main.py を起動するのは上述通り cron で起動するか、php はたいてい CGI (か mod_php)が対応しているので

<?php
exec('/usr/bin/python36 '.__DIR__.'/main.py', $out);
print_r($out);

のような php ファイルを main.py と同じ場所においてブラウザアクセスして起動させる。cron 起動だと print で標準出力しているものが実行結果としてメールで定期送信されるから楽。

でもさすがにQ学習を共用サーバーなんかでやったらすぐ落とされるんだろうなー

python共用サーバー

Posted by ak