レンタルサーバーで Python は要注意!VPS が楽得でおすすめな理由

レンタルサーバー(共用サーバー)は安いし Python の勉強だったりサービスの公開にも使えるんじゃないかなと思っているそこのあなた。

気持ちはわかりますが、共用サーバーの Python はクセがあります。

こちらの記事ではその理由と、Python の実行におすすめの VPS を紹介します。

先に最終的な自分のおすすめを発表しておくとConoHa VPSさくらの VPSになりますが、その理由もこの記事で説明していきます。

共用サーバー x Python の注意点

結論から言うと共用サーバーで Python プログラミングを行うのは一部を除いて難易度が無駄に高いです。

その理由はレンタル共用サーバーならではの権限の制限。

通常 Python で開発するのに必要とされる環境と異なる状況になってしまっている事がしばしばあります。

そしてそれを解決する術がない場合も多いのです。

1. 公式サイトでは分からない問題

公式サイトで共用サーバーの仕様欄を見ると、大抵 Python3 と MySQL データベースの記載があるため一見問題なさそうです。

ただ、実際に使ってみるとさまざまな制限がかかっているのが共用サーバーです。

ざっくりいうと、物によって下記の様な事象があります。(他にもあるかも)

  • SSH 接続ができない → Python すら触れない
  • 仮想環境が使えない → 複数のアプリを作るのに向いていない
  • Python でデータベースが使えない → スクレイピング等に向いていない

私が少し触って確認できたものだけでこんな感じなので、もっとプログラミングを進めていくと他にもいろいろ出てくる気はします。

詳しくは下記の記事も読んでみてください。

▶︎【7社比較】レンタルサーバーの大クセ Python は本当は使いづらい?

2. 環境構築からエラー頻発

プログラミングで物を作っていこうとすると様々なエラーが発生します。

これは普通のことで、都度調べて修正していくのがプログラミングです。

ただ、ここまで読んでいただいてわかる通り、レンタルサーバーでは環境構築の時点でエラーが発生しまくります。

環境構築というのは「Python を使える様にする」、「データベースを使える様にする」、などいわば準備段階です。レンタルサーバーではこの準備段階でつまづくため肝心のプログラミングに辿り着く前に心を折られます

3. 共用サーバー x Python のエラーは情報が無い

そういった「共用サーバーならではのエラー」を調べても情報はほとんどなく、たとえ英語で調べても日本のレンタルサーバーに関連する情報は見つかりません。

そして散々時間をかけて調べた挙句「そもそも権限がないのでどうしようもない」という事が多々あります。

それも環境構築の段階でです。

同じ労力を払うならVPSの方が有意義

ここまでレンタルサーバーの Python 環境構築がいかに難しいか説明してきましたが、その点 VPS は制限がほとんどないので逆にスムーズです。

VPSはなんとなくハードルが高く見えますが、Pythonを使う、データベースを使う、などに関してはレンタルサーバーよりもシンプルなケースが多いですし、Python プログラミングに関していうとレンタルサーバーと比べて圧倒的に既存の情報が多いです。

ニッチな学び vs メジャーな学び

権限を制限されたレンタルサーバーでそもそも存在するかも分からない解決法を探るよりも、VPSで実践的な Linux 系サーバーの操作Python のプログラミングを学んでいく方がコスパもいいです。

もし「将来的に業務でも使える様になれば」と考えているなら余計に VPS の方が良いです。業務の Python 実行環境にレンタルサーバーを使う会社は流石にないはずです。

そもそも VPS も月々 700 円〜900 円程度ですしね。

というわけでそろそろ「どの VPS がおすすめなのか」を説明します。

VPS はレンタルサーバーと比べて圧倒的に自由度が高く、「どの会社の VPS か」よりも「どの OS か」の方が重要だったりします。

詳しくはこちらの記事を参照いただければと思いますが、OS は既存情報の多い Ubuntu、Debian、CentOS がおすすめです。

後々エラーなどに出くわしたときにも便利です。

Ubuntu、Debian、CentOS のインストールが簡単な VPS

Ubuntu、Debian、CentOS ですが、実はメジャーな VPS は大体対応しています。

ではその中で更に絞るには何を基準にしたらいいでしょうか。

ここは「OS インストールの簡単さ」で選びましょう。

実は VPS によっては特定の OS インストールをほぼ自動でやってくれるものがあります。

なので最後に Ubuntu、Debian、CentOS のインストールを簡単に行える VPS を紹介します。

自動インストールの手順は各社様々で、例えばさくらの VPS であればコントロールパネルで選択した OS を自動でインストールしてくれますし、GMO のクラウド VPS であれば契約時に選択した OS をインストールされた状態でサーバーが用意されます。

さらに ConoHa VPS に関しては Python のウェブ開発フレームワークである Django のセットアップまである程度自動化されています。

各社の OS 自動インストールの対象は下記の通りです。

自動 OSConoHa VPSさくらの VPSお名前.com VPSGMO クラウド VPSKagoya Cloud VPS
Ubuntu
Debian
CentOS
その他Django テンプレ無料お試し

1. ConoHa VPS

ConoHa VPS
自動インストール対象 OSCentOS 7.1 〜 7.9
CentOS Stream 8
CentOS Stream 9
Ubuntu 18.04
Ubuntu 20.04
Debian 9.13
Debian 10.10
Debian 11.0
自動インストール方法サーバー追加時にテンプレートを選択することでサーバー作成と同時にOSのインストールやアプリケーションサーバーの構築が完了。

公式ページVPS を追加する
おすすめプラン1G(初期費用無料 + 月額 723 円〜)

解説

今回紹介する中で対応 OS の種類が最も豊富なのがこちらの ConoHa VPS。

「VPSをもっと速く、かんたんに」というキャッチコピーだけあって、OS だけでなく Django のテンプレートもあり、簡単にセットアップが可能です。「Django のインストールは自分でやりたい」という方はもちろんそれも可能です。

自動インストール対象の OS の種類も多いですし、下の記事の様に公式が親切に色々な情報を載せているのもポイントです。

3 ステップで簡単に始められるとの事で、公式サイトに「たったの25秒で〜サーバーが作れます。」とありますので試してみてください。笑

公式サイトConoHa VPS

2. さくらの VPS

さくらのVPS
自動インストール対象 OSUbuntu 18.04
Ubuntu 20.04
CentOS 7
CentOS Stream 8
自動インストール方法VPSコントロールパネルからワンクリックで再インストールが可能。

公式ページさくらの VPS 新規追加(コントロールパネル)
おすすめプラン1G(初期費用無料 + 月額 880 円〜)

解説

かなり気軽に使える VPS で、私自身もさくらの VPS を使っています。ポートの開閉をコントロールパネル上のクリックで行えるパケットフィルター機能が地味に楽です。

ユーザーへのサポートをかなり意識していて、公式サイトでも VPS のセットアップの手順を詳しく説明してくれているのもありがたいです。

ネコでもわかる!さくらのVPS講座 ~第二回「サーバーをさわってみよう!」

「Django VPS」で検索すると最も日本語記事が出てくるのは「さくらの VPS」です。

公式サイトさくらのVPS

3. お名前.com VPS

お名前.com VPS
自動インストール対象 OSUbuntu 18.04
Ubuntu 20.04
CentOS 7.5 ~ 7.9
CentOS Stream 8
Debian 9.13
Debian 10.10
自動インストール方法VPSコントロールパネルのサーバーセットアップで OS とバージョンを選択可能。

公式ページサーバーを初期セットアップする
おすすめプラン1G(初期費用無料 + 月額 873 円)

解説

オンラインでのお申込みから最短10分で利用開始できるというお名前.com の VPS。

KVM という仮想化方式を採用していて、ネットワークやディスクI/Oのパフォーマンスを良くする Virtio ドライバにも対応するなどハイパフォーマンスを追求している VPS

OS の初期インストールの方法は下記の公式ページに記載があります。

公式サイトお名前.com VPS

4. クラウドVPS by GMO

GMOクラウドのVPS 詳細はこちら
自動インストール対象 OSCentOS 7.9
CentOS 8.2
Ubuntu 20.04
Debian 10.0
自動インストール方法契約時に選択した OS をインストールした状態でサーバーが用意される。

公式ページ新規サーバー申し込み方法
おすすめプランV1(初期費用無料 + 月額 968 円〜)
お得な情報14 日間無料お試し

解説

コンテナ技術を採用していて、一般的な仮想マシンに比べて軽量で vCPU やメモリなどの負荷が小さく、リソースを効率的に利用できる VPS。どちらかというと法人ユーザーを想定しているようですが、14 日間の無料お試し期間があるのは他と違う点です 。

契約時の OS 選択について下記の公式ページで解説が載っています。

公式サイトGMOクラウドのVPS 詳細はこちら

5. KAGOYA Cloud VPS

カゴヤ・ジャパン
自動インストール対象 OSCentOS 7
CentOS 8
CentOS Stream 8
Ubuntu 18.04
Ubuntu 20.04
自動インストール方法専用コントロールパネルからテンプレートとアプリケーションを選択して環境構築可能。

公式ページインスタンス作成
おすすめプラン1コア/1GB(初期費用無料 + 月額 〜550 円)

解説

コントロールパネルから即座にスペック変更することができます

こちらもコントロールパネルからインスタンスを作成する際に任意の OS を指定することができます。

公式サイトカゴヤ・ジャパン

個人的には ConoHa VPS かさくらの VPS がおすすめ

OS インストールの手軽さを基準に Python のおすすめ VPS を 5 つ紹介しましたが、いかがだったでしょうか?

個人的なおすすめは ConoHa VPSさくらの VPS です。

ConoHa VPS は申し込み時の手軽さと、さくらの VPS は既に利用している人がかなりいる & 私自身も Django に利用していて全く不満がないからというのが理由です。

大量のデータを取り扱う大規模なアプリケーションを作成するのであれば GMO のクラウド VPSお名前.com の VPS(KVM)もいいかと思いますが、個人で小さい Python プログラムを作っていくような場合は前述の 2 つかなと思います。

もしよければ下記も参考にしてみてください。

▶︎【7社比較】レンタルサーバーの Python は本当は使えない?

XREA のレンタルサーバーにSSHでログインする方法

SSH を有効化する

まず XREA のダッシュボードで SSH を有効化する必要があります。

サイト設定 > ツール/セキュリティーをクリックします。

遷移先の画面で「SSH接続IP許可」をクリックします。

続けて「SSH接続のIPを許可する」をクリックします。

これでまず SSH 接続ができるようになりました。

サーバー、アカウント、パスワードを確認

契約情報の画面を開き、サーバーアカウント情報の欄を参照します。

ここでログインに必要な情報を確認できます。

  • サーバー
  • アカウント
  • パスワード

これらの情報を使って SSH 接続していきます。

ターミナルを起動する

ターミナルを起動し、「ssh アカウント@サーバー」の形式で入力します。

例えば、サーバーが「s123.xrea.com」でアカウントが「abcabc」だった場合、上記画面の情報を元にコマンドは「ssh abcabc@s123.xrea.com」となります。入力して Enter。

% ssh ssh abcabc@s123.xrea.com

初回は下記のようなメッセージが表示され、yes か no を求められますが、yes と入力して Enter で大丈夫です。

The authenticity of host 's123.xrea.com (123.45.6.78)' can't be established. ECDSA key fingerprint is XXXXXX:XxXXXxxXX+XXXXXXXXxxxxxxXXxXxxxxXXxXXXX. Are you sure you want to continue connecting (yes/no/[fingerprint])?

yes そして Enterすると下記のメッセージが表示され、続けてパスワードを求められます。

Warning: Permanently added 's123.xrea.com,123.45.6.78' (ECDSA) to the list of known hosts.

パスワード入力してログイン完了

下記の様にパスワードを求められるので入力します。(タイプしても表示されないので注意)

abcabc@s123.xrea.com's password: 

パスワードを入力して Enter を押下すればログイン完了です。

PHP のバージョンを確認

ログインついでに現在インストールされている PHP のバージョンも確認してみます。コマンド「php --version」を実行してみます。

$ php --version
PHP 7.0.33 (cgi-fcgi) (built: Feb  3 2021 10:55:56)
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with the ionCube PHP Loader + ionCube24 v10.3.9, Copyright (c) 2002-2019, by ionCube Ltd.
    with Zend OPcache v7.0.33, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.9.0, Copyright (c) 2002-2019, by Derick Rethans
$ 

PHP 7.0.33 が入っている様です。

ついでに Python のバージョンを確認

さらについでに現在インストールされている Python のバージョンも確認してみます。コマンド「python --version」と「python3 --version 」をそれぞれ実行してみます。

$ python --version
Python 2.7.5
$ python3 --version
Python 3.6.13

と言うわけで現在は Python 2.7.5 と Python 3.6.13 が入っていますね。

そしてさらについでに下記3行を順に実行すれば Python 仮想環境の作成&起動もできます。

$ python3 -m venv python3-venv
$ source python3-venv/bin/activate
(python3-venv) $ python

ついでに、Python 仮想環境の中で下記を順に実行していけば MySQL のデータベースを取り扱うための MySQLdb モジュールを使うこともできます。

>>> exit()
$ pip install mysqlclient
$ python
>>> import MySQLdb
>>> 

バリューサーバーのレンタルサーバーにSSHでログインする方法

SSH を有効化する

まずバリューサーバーのコントロールパネルで SSH を有効化する必要があります。

左側のメニューでお役立ちツールをクリックします。

そして下に表示されるメニューで「SSH接続」をクリックします。

下記で「SSH登録」をクリックします。

これで SSH を有効化する設定は完了です。数分待ちます。

サーバー、アカウント、パスワードを確認

ダッシュボードのメニューから FTP > FTP設定・アカウント発行をクリックします。

ここでログインに必要な情報を確認できます。

  • FTPサーバー
  • FTPアカウント
  • FTPパスワード

これらの情報を使って SSH 接続していきます。

ターミナルを起動する

ターミナルを起動し、「ssh FTPアカウント@FTPサーバー」の形式で入力します。

例えば、FTPサーバーが「s12.valueserver.jp」でFTPアカウントが「abcabc」だった場合、上記画面の情報を元にコマンドは「ssh abcabc@s12.valueserver.jp」となります。入力して Enter。

% ssh ssh abcabc@s123.xrea.com

初回は下記のようなメッセージが表示され、yes か no を求められますが、yes と入力して Enter で大丈夫です。

The authenticity of host 's12.valueserver.jp (123.4.567.89)' can't be established. ECDSA key fingerprint is XXXXXX:XxXXXxxXX+XXXXXXXXxxxxxxXXxXxxxxXXxXXXX. Are you sure you want to continue connecting (yes/no/[fingerprint])?

yes そして Enter すると下記のメッセージが表示され、続けてパスワードを求められます。

Warning: Permanently added 's12.valueserver.jp,123.45.6.78' (ECDSA) to the list of known hosts.

パスワード入力してログイン完了

下記の様にパスワードを求められるので入力します。(タイプしても表示されないので注意)

abcabc@s123.xrea.com's password: 

パスワードを入力して Enter を押下すればログイン完了です。

PHP のバージョンを確認

ログインついでに現在インストールされている PHP のバージョンも確認してみます。コマンド「php --version」を実行してみます。

$ php --version
PHP 7.4.25 (cgi-fcgi) (built: Oct 19 2021 15:18:10)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.27, Copyright (c), by Zend Technologies
$ 

PHP 7.4.25 が入っている様です。

ついでに Python のバージョンを確認

さらについでに Python のバージョンも確認してみます。コマンド「python --version」と「python3 --version 」をそれぞれ実行してみます。

$ python --version
Python 3.6.8
$ python3 --version
Python 3.6.8

現状 python でも python3 でも Python 3.6.8 が実行されるみたいですね。Python2 を起動したいときはコマンド「python2」を実行します。

ただ、Python 仮想環境の作成を実行しようとすると何かエラーが返ってきますね。

$ python3 -m venv python3-venv
Error: Command '['/virtual/アカウント名/python3-venv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 2.

ロリポップのレンタルサーバーにSSHでログインする方法

SSH を有効化する

まずロリポップのユーザー専用ページで SSH を有効化する必要があります。

サーバーの管理・設定 > SSH をクリックします。

下記の画面が表示されるので「SSHを有効にする」をクリックします。

これでまず SSH 接続ができるようになりました。

アカウント名、初期ドメイン、パスワードを確認

次の画面でログインに必要な情報を確認できます。

  • サーバー
  • アカウント
  • 接続ポート
  • パスワード

これらの情報を使って SSH 接続していきます。

ターミナルを起動する

ターミナルを起動し、「ssh アカウント@サーバー -p 接続ポート」の形式で入力します。

例えば、アカウントが「bambina.jp-abcabc」だった場合、上記画面の情報を元に「ssh bambina.jp-abcabc@ssh.lolipop.jp -p 2222」となります。入力して Enter。

% ssh bambina.jp-abcabc@ssh.lolipop.jp -p 2222

初回は下記のようなメッセージが表示され、yes か no を求められますが、yes と入力して Enter で大丈夫です。

The authenticity of host '[ssh.lolipop.jp]:2222 ([133.130.35.108]:2222)' can't be established. ECDSA key fingerprint is XXXXXX:XxXXXxxXX+XXXXXXXXxxxxxxXXxXxxxxXXxXXXX. Are you sure you want to continue connecting (yes/no/[fingerprint])?

yes そして Enterすると下記のメッセージが表示され、続けてパスワードを求められます。

Warning: Permanently added '[ssh.lolipop.jp]:2222,[133.130.35.108]:2222' (RSA) to the list of known hosts.

パスワード入力してログイン完了

下記の様にパスワードを求められるので入力します。(タイプしても表示されないので注意)

bambina.jp-abcabc@ssh.lolipop.jp's password: 

パスワードを入力して Enter を押下すればログイン完了です。

ただ、ログインシェルが rbash になっていてかなり制限がかかっているので、ログイン後にコマンド「bash」を実行して rbash から bash に切り替える必要があります。

ついでに Python のバージョンを確認

ログインついでに現在インストールされている Python のバージョンも確認してみます。コマンド「python --version」と「python3 --version 」をそれぞれ実行してみます。

$ python --version
Python 2.7.5
$ python3 --version
Python 3.7.12

と言うわけで現在は Python 2.7.5 と Python 3.7.12 が入っていますね。

そしてさらについでに下記を順に実行すれば Python 仮想環境の作成&起動もできます。

$ bash
$ python3 -m venv python3-venv
$ source python3-venv/bin/activate
(python3-venv) $ python
Python 3.6.13 (default, Apr  7 2021, 03:38:31) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

さらについでに MySQLdb モジュールを使える様 mysqlclient をインストールしようとすると。。

>>> exit()
$ pip install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-2.1.0.tar.gz (87 kB)
    ERROR: Command errored out with exit status 1:
     command: /home/users/0/bambina.jp-アカウント/python3-venv/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-zoshgtdz/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-zoshgtdz/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-l1irr5km
         cwd: /tmp/pip-install-zoshgtdz/mysqlclient/
    Complete output (15 lines):
    /bin/sh: mysql_config: コマンドが見つかりません
    /bin/sh: mariadb_config: コマンドが見つかりません
    /bin/sh: mysql_config: コマンドが見つかりません
    mysql_config --version
    mariadb_config --version
    mysql_config --libs
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-zoshgtdz/mysqlclient/setup.py", line 15, in <module>
        metadata, options = get_config()
      File "/tmp/pip-install-zoshgtdz/mysqlclient/setup_posix.py", line 70, in get_config
        libs = mysql_config("libs")
      File "/tmp/pip-install-zoshgtdz/mysqlclient/setup_posix.py", line 31, in mysql_config
        raise OSError("{} not found".format(_mysql_config_path))
    OSError: mysql_config not found
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
WARNING: You are using pip version 20.1.1; however, version 21.3.1 is available.
You should consider upgrading via the '/home/users/0/bambina.jp-アカウント/python3-venv/bin/python3 -m pip install --upgrade pip' command.

エラーが出てしまいました。

さくらレンタルサーバーでスクレイピング定期実行 & DB 保存

さくらのレンタルサーバを使ってスクレイピングをする方法をまとめます。

初めに言いますがページ遷移はカバーしていません。

eBay の商品情報を例としてページの要素を取得し、MySQL のデータベースに insert する一連の過程をまとめたいと思います。最後は CRON を使って定期実行させる設定も行います。

なので最低限 MySQL と CRON が使える「さくらのレンタルサーバ スタンダード」以上のプランを想定しています。

一応自分の忘備録としてまとめていますが、過程を追っていただければと思います。

  1. 実行環境の準備
  2. スクレイピングをしてみる
  3. データを保存する DB の作成
  4. Python からデータベースを操作する
  5. CRON で定期実行する

1. 実行環境の準備

まず始めるにあたってサーバー上に Python3 をインストールして仮想環境を作成します。

Python3 のインストール

さくらレンタルサーバのデフォルトの Python は Python2 なので Python3 を別途インストールする必要があります。下記の記事で手順を説明しています。

▶︎Python3 をインストールする方法

仮想環境の作成

Python3 のインストールが完了したら、任意の場所に仮想環境を作成します。

例として仮想環境「scraping_venv」を作成します。

% python3 -m venv scraping_venv
% 

仮想環境のパスに入り起動します。

% cd scraping_venv
% source bin/activate.csh
(scraping_venv) % 

3. スクレイピングをしてみる

では早速、requests モジュールを使ってページの情報を取得してみます。

requests のインストール

Web ページの取得に便利な requests をインストールするためコマンド「pip3 install requests」を実行します。

(scraping_venv) % pip3 install requests

インストールが完了したら Python3 を起動しますが、仮想環境を起動しているのでコマンド「python」で 起動できます。

(scraping_venv) % python
Python 3.9.0 (default, Jan  3 2021, 10:29:59) 
[GCC 4.2.1 20070831 patched [FreeBSD]] on freebsd9
Type "help", "copyright", "credits" or "license" for more information.
>>>

eBay ページの取得

requests をインポートし、requests.get() で URL「https://www.ebay.com/b/Video-Game-Consoles/139971/bn_320033」のソースコードを取得します。

>>> import requests
>>> r = requests.get('https://www.ebay.com/b/Video-Game-Consoles/139971/bn_320033')
>>> 

一旦変数 r に全部入ったので、r.text を実行するとソースコードが確認できます。

>>> r.text
'<!DOCTYPE html><!--[if IE 9]><html class="ie9" lang="ja"><![endif]--><!--[if gt IE 9]><!--><html lang="ja"><!--<![endif]--><head><style>\n    .font-marketsans body {\n        font-family: "Market Sans", Arial, sans-serif;\n    }\n</style><script>\n    (function() {\n        var useCustomFont = (\'fontDisplay\' in document.documentElement.style) ||\n                        (localStorage && localStorage.getItem(\'ebay-font\'));\n        if (useCustomFont) {\n            document.documentElement.classList.add(\'font-marketsans\');\n        }\n    })();\n</script><meta charset="utf-8"><link rel="'preconnect'" href="https://ir.ebaystatic.com" /><meta Property="og:description" Content="Shop eBay for great deals on ビデオゲームコンソール. You'll find new or used products in ビデオゲームコンソール on eBay. Free shipping on selected items." />

ソースコードを取得出来ることを確認できたので「exit()」を実行して一旦 Python のコンソールから出ます。

>>> exit() 
(scraping_venv) % 

Beautiful Soup で HTML 要素抽出

ページのソースを取得することはできたので、今度はそのソースコードから具体的な HTML の要素を抽出していきます。

HTML の取り扱いに便利な BeautifulSoup4 をインストールするためコマンド「pip3 install beautifulsoup4」を実行します。

(scraping_venv) % pip3 install beautifulsoup4

インストールが完了したら再度 Python3 を起動して BeautifulSoup と requestsをインポートします。

(scraping_venv) % python3
>>> from bs4 import BeautifulSoup
>>> import requests
>>> 

とりあえず eBay のページからサムネイル URL、商品名、商品ページ URL を取得したいと思います。

>>> r = requests.get('https://www.ebay.com/b/Video-Game-Consoles/139971/bn_320033')
>>> soup = BeautifulSoup(r.text,'html.parser')
>>> sitem = soup.find_all('li',class_='s-item') # クラス名が「s-item」の li 要素のリストを取得

Chrome のデベロッパーツールでページの構造を確認したところ、どうやらサムネイル URL、商品名、商品ページ URL は li 要素の中に含まれていて、その li 要素のクラス名が s-item だったので上記の様に取得しました。

取得した li 要素はリスト形式になっているので、for ループで各 li 要素からそれぞれの項目を抽出し、print していきます。

>>> for li in sitem: # 各 li 要素に対して処理を行う
...     img = li.find('img') # li 要素内の img 要素を取得
...     img_src = img.get('src') # img 要素内の src 属性を取得
...     name = li.find('h3') # li 要素内の h3 要素を取得
...     name_text = name.text # h3 要素内の文字列を取得
...     link = li.find('a') # li 要素内の a 要素を取得
...     link_href = link.get('href') # a 要素内の href 属性を取得
...     print(img_src)
...     print(name_text)
...     print(link_href)
... 

Enter を2度押下するとプログラムが実行されサムネイル、商品名、商品ページ URL が交互に表出されます。

... 
https://i.ebayimg.com/thumbs/images/g/Tl0AAOSwZpJgOul6/s-l300.jpg
ソニー PS5 ブルーレイエディションコンソール ( ディスク版 ) - クリスマス前に配達 !
https://www.ebay.com/p/19040936896?iid=154349758236
https://i.ebayimg.com/thumbs/images/g/AD4AAOSw3YphYRwA/s-l300.jpg
オリジナルNintendo EntertainmentシステムビデオゲームバンドルセットキットNESコンソールOG
https://www.ebay.com/p/101801921?iid=333818163486
https://i.ebayimg.com/thumbs/images/g/910AAOSwV5FhgtgV/s-l300.jpg
ソニー PS5 PlayStation 5 デジタル版コンソール-クリスマス配信前 !
https://www.ebay.com/p/25040975636?iid=154369068285

〜省略〜

https://ir.ebaystatic.com/cr/v/c1/s_1x2.gif
Microsoft Xbox One Day One Edition - 500 ギガバイトコンソールキネクトボックスコントローラテスト済み
https://www.ebay.com/itm/284613629401?hash=item42444b55d9:g:jBkAAOSwqldh5hbZ
https://ir.ebaystatic.com/cr/v/c1/s_1x2.gif
Nintendo Wii コンソール RVL-001 パワーリード 、 TVリード 、 センサーバー付き
https://www.ebay.com/itm/165287981385?hash=item267bee7149:g:I00AAOSwibph5VVv
https://ir.ebaystatic.com/cr/v/c1/s_1x2.gif
カシオゲームカンフーファイトCG - 310 ハンドヘルドゲーム 1990
https://www.ebay.com/itm/125105279976?hash=item1d20db13e8:g:J-IAAOSwn8dh5cND
>>> 

無事情報の抽出が出来ることを確認できたので、一旦「exit()」で Python のコマンドプロンプトから出ます。

>>> exit()
(scraping_venv) % 

同じ処理を Python ファイルで実行

一括で処理を実行できる様に、これまで実行したコマンドをまとめて下記のように一つのファイル(ebay_scraping.py)にまとめました。

# ebay_scraping.py
from bs4 import BeautifulSoup
import requests

r = requests.get('https://www.ebay.com/b/Video-Game-Consoles/139971/bn_320033')
soup = BeautifulSoup(r.text,'html.parser')
sitem = soup.find_all('li',class_='s-item') # クラス名が「s-item」の li 要素のリストを取得

for li in sitem: # 各 li 要素に対して処理を行う
    img = li.find('img') # li 要素内の img 要素を取得
    img_src = img.get('src') # img 要素内の src 属性を取得
    name = li.find('h3') # li 要素内の h3 要素を取得
    name_text = name.text # h3 要素内の文字列を取得
    link = li.find('a') # li 要素内の a 要素を取得
    link_href = link.get('href') # a 要素内の href 属性を取得
    print(img_src)
    print(name_text)
    print(link_href)

これを仮想環境「scraping_venv」直下にアップロードします。

そしてコマンド「python3 ebay_scraping.py」を実行します。

(scraping_venv) % python3 ebay_scraping.py
https://i.ebayimg.com/thumbs/images/g/Tl0AAOSwZpJgOul6/s-l300.jpg
ソニー PS5 ブルーレイエディションコンソール ( ディスク版 ) - クリスマス前に配達 !
https://www.ebay.com/p/19040936896?iid=154349758236
https://i.ebayimg.com/thumbs/images/g/GygAAOSwehBh5hlm/s-l300.jpg
ソニー PSP-3000 コンソール キングダム ハートゲームコンソール モンスターハンターゲームソフト付き
https://www.ebay.com/itm/313838198557?hash=item491236df1d:g:GygAAOSwehBh5hlm
https://i.ebayimg.com/thumbs/images/g/AD4AAOSw3YphYRwA/s-l300.jpg
オリジナルNintendo EntertainmentシステムビデオゲームバンドルセットキットNESコンソールOG
https://www.ebay.com/p/101801921?iid=333818163486

〜省略〜

https://ir.ebaystatic.com/cr/v/c1/s_1x2.gif
新品 ソニー PS4 Playstation 4 コンソール 1 TBスリム-新品送料無料
https://www.ebay.com/p/13031982632?iid=255337489506
https://ir.ebaystatic.com/cr/v/c1/s_1x2.gif
Nintendo GameCubeモデルNo. DOL -101 コンソールパーツと修理のみゲーム付き
https://www.ebay.com/itm/165288586955?hash=item267bf7aecb:g:TIgAAOSwZf9h5cbT
https://ir.ebaystatic.com/cr/v/c1/s_1x2.gif
Nintendo GameCube リージョンスイッチ付き LED mod カスタムコントローラ付き
https://www.ebay.com/itm/165288874148?hash=item267bfc10a4:g:u1cAAOSw3MJh5fWT
(scraping_venv) % 

無事サムネイル、商品名、商品ページ URL、が表出されました。ページに掲載される商品がタイミングによって違うので前回の実行時と若干内容が変わっています。

4. データベースの作成

ここまではただターミナル上に print してきましたが、これらの情報をデータベースに保存できる様にします。

さくらレンタルのコントロールパネルでデータベース作成

コントロールパネルのデータベースのセクションで「新規追加」をクリックします。

WordPress を使っている場合はそのデータベースが既にあると思いますが、何かを間違えて WordPress 用のテーブルに影響が出ると良くないので新規のデータベースを作ることをお勧めします。

無事新たなデータベースが作成されたので phpMyAdmin へログインします。

phpMyAdmin でテーブル作成

ログインした後、先ほど作成したデータベースを選択するとテーブル作成の画面に遷移すると思います。

テーブル名を入力して「Go」をクリックします。

カラム名、形式、長さを入力して「Save」をクリックします。

これでテーブル作成は完了です。下記のように反映されていると思います。

これでデータベースとその中にテーブルが出来上がりました。

5. Python からデータベースを操作する

では Python プログラムで抽出した情報をそのままデータベースのテーブルに insert 出来るようにしていきます。

MySQLdb モジュールで操作する

まずは Python で MySQL を操作するために必要な MySQLdb モジュールを使える様、ピp3で「mysqlclient」をインストールします。

(scraping_venv) % pip3 install mysqlclient

インストールしたら Python を起動し、MySQLdb をインポートしてデータベースに接続します。

(scraping_venv) % python3
>>> import MySQLdb
>>> conn = MySQLdb.connect(host='データベースサーバ', db='データベース名',user='ユーザー名',passwd='パスワード',charset='utf8mb4')
>>>

そして試しに先ほど作成したテーブル「ebay_products」に select クエリを叩いてみます。

>>> c = conn.cursor()
>>> c.execute('select * from ebay_products')
0
>>> 

まだデータを何も入れていないので 0 と返ってきています。動作は特に問題なさそうです。

Python ファイルに追記する

では先ほど作成した ebay_scraping.py を編集します。

MySQLdb モジュールでデータベースに接続する部分と合わせて、データを print する代わりにテーブルへ insert する様変更します。

# ebay_scraping.py
from bs4 import BeautifulSoup
import requests
import MySQLdb # 追記分

# 追記分↓
conn = MySQLdb.connect(host='データベースサーバー', db='データベース名',user='ユーザー名',passwd='パスワード',charset='utf8mb4')
c = conn.cursor()
# 追記分↑

r = requests.get('https://www.ebay.com/b/Video-Game-Consoles/139971/bn_320033')
soup = BeautifulSoup(r.text,'html.parser')
sitem = soup.find_all('li',class_='s-item')

for li in sitem:
    img = li.find('img')
    img_src = img.get('src')
    name = li.find('h3')
    name_text = name.text
    link = li.find('a')
    link_href = link.get('href')
    # print(img_src)
    # print(name_text)
    # print(link_href)
    # 追記分↓
    c.execute('insert into ebay_products values("'+img_src+'","'+name_text+'","'+link_href+'")')
    
conn.commit()
# 追記分↑

ではファイルを実行してみます。

(scraping_venv) % python3 ebay_scraping.py
(scraping_venv) % 

phpMyAdmin で対象のテーブルを開くとちゃんとデータが入っています。

これで eBay からデータを取得してデータベースへ保存するところまで出来ました。

6. CRON で定期実行する

作成したプログラムを定期的に実行する上で便利なのが CRON です。さくらのコントロールパネルから設定できるのでこの際やってみましょう。

コントロールパネル左下の「スクリプト設定」>「CRON設定」を開き「スケジュール追加」をクリックします。

設定画面が開くので実行コマンドと実行日時を設定します。毎日 21:00 に実行する設定にします。

「実行コマンド」欄は今回の場合「cd 実行ファイルのパス; Python3 の絶対パス 実行ファイル名」の形で下記の様に入力します。

cd www/notemite/scraping_venv; /home/ユーザー名/local/python/bin/python3 ebay_scraping.py

Python3 の絶対パスはコマンド「which python3」で確認できます。

% which python3
/home/ユーザー名/local/python/bin/python3

「保存する」をクリックして CRON 設定は完了です。

これで毎日 21:00 に ebay_scraping.py が実行され、取得したデータがデータベースのテーブルに insert されていきます。

複数処理を順に実行したい場合

余談ですが、設定できる CRON の数には限りがあるので、一つの処理につき一つの CRON を設定するとすぐ使い切ってしまいます。

なので例えば process_A.py、process_B.py、process_C.py という順番で実行したいプログラムがあった場合、まず CRON 設定の実行コマンドに下記を記述します。

cd www/notemite/scraping_venv; /bin/sh multiple_process.sh

これで CRON からは multiple_process.sh が実行されるので、個別のファイルと同じディレクトリに multiple_process.sh というファイルを作成し下記のように記述します。

#!/bin/sh
/home/ユーザー名/local/python/bin/python3 process_A.py &&
/home/ユーザー名/local/python/bin/python3 process_B.py &&
/home/ユーザー名/local/python/bin/python3 process_C.py

これによって CRON によって multiple_process.sh 呼び出され、まず process_A.py を実行、処理が成功したら process_B.py、さらにそれが成功したら process_C.py という具合に実行することができます。

WordPress 4.7 から 5.8 へ無事アップデート出来たご報告

おそらく 2017 年ごろから更新していなかったので 5 年近く WordPress のアップデートを放置していた様です。

その間に WordPress のエディタは Gutenberg へと大きく変わっておりました。

アップデートした方が良いだろうなと思いつつ「更新時に何かエラーが起きたら」と思うと面倒でずっと放置してきたんですが、いよいよ旧バージョンのエディタが不便に思えて仕方がないので更新することにしました。

WordPress の公式ドキュメントも参考にしつつ進めていきます。

  1. 要件の確認
  2. データベースとファイルのバックアップ
  3. WordPress の更新
  4. 記事のブロックエディタ変換

1. 要件の確認

まず 2022 年 1 月時点での WordPress の要件を確認しておきます。

PHPバージョン 7.4 以上
データベースMySQL バージョン 5.7 以上または MariaDB バージョン 10.2 以上
SSLHTTPS対応
2022 年 1 月時点

では上記を確認していきます。

PHP のバージョン

PHP のバージョンはサーバーに ssh でログインして「php --version」を実行して確認。

% php --version
PHP 7.4.25 (cli) (built: Nov 11 2021 13:56:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.25, Copyright (c), by Zend Technologies
% 

PHP 7.4.25 なので用件は満たしています。

MySQL のバージョン

続いて MySQL のバージョンを確認します。サーバーに ssh 等でアクセスできる場合は「mysql --version」を実行して確認できます。

% mysql --version
mysql  Ver 14.14 Distrib 5.5.32, for FreeBSD9.1 (amd64) using  5.2
% 

私はさくらのレンタルサーバーを使っていてデータベースのサーバに ssh 接続出来なかったので、コントロールパネルのデータベースタブで確認しました。

こちらも MySQL 5.7 ということで要件を満たしています。

SSL

HTTPS 対応に関してもさくらのレンタルサーバのコントロールパネルで確認しました。

「ドメイン/SSL」ページで対象のサイトの SSL を確認します。

2. データベースとファイルのバックアップ

上記の画像の通り、データベースとファイルをバックアップするようお勧めされているので従います。

データベースのバックアップ

まずはデータベースから。

phpMyAdmin でデータベースを丸ごとエクスポートします。

phpMyAdmin にログインしたら対象のデータベースを開き、全テーブルにチェックを入れ、「With selected:」の欄で「Export」を選択します。

するとエクスポートの画面へ遷移します。

デフォルトだと「Quick」にチェックが入っていますが「Custom」にチェックを入れます。

このままだと全テーブルの CREATE 文が一つの SQL ファイルにまとまってダウンロードされます。

今回はテーブル毎のファイルでダウンロードした方が便利な気がするので「Output」のセクションで「Export tables as separate files」にチェックを入れます。

「Object creation options」のセクションで「Add DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER statement」と「IF NOT EXISTS (less efficient as indexes will be generated during table creation)」にチェックを入れます。

一番下の「Go」をクリックするとダウンロードが始まります。

ダウンロードされた zip ファイルを解凍するとテーブルごとの SQL が入っています。

これでデータベースのバックアップはよしとします(願望)。

▶︎WordPress のバックアップ(公式サイト)

サイト関連ファイルのバックアップ

サイトのフォルダの一つ上の階層へ移動し、バックアップしておきたいフォルダを丸ごと「cp -r」コマンドでコピーします。

例えば「www」をいうディレクトリの中にある「notemite」というディレクトリ内に、WordPress を含むサイト関連のファイルが全て入っている場合。

「www」ディレクトリで下記のコマンドを実行します。

% cp -r notemite notemite_20220117

これで「www」ディレクトリの中に元々あった「notemite」ディレクトリはそのままの状態で、さらに「notemite_20220117」ディレクトリが作成されました。

これでとりあえずサイト関連のファイルのバックアップも完了です。

3. WordPress の更新

意を決して更新します。

するとしばらくして下記のページに切り替わりました。どうやら更新と同時にサイトが見れなくなるような事態は避けられたようです。

サイトにもアクセスしていくつかページを開いてみましたが、パーマリンクなども異常ありませんでした。よかった。

4. 既存記事をブロック形式へ変換

既存記事を開くと下記のように「クラシック」と表記がある場合があります。

この場合、記事が旧形式のままでブロックエディタに対応していないので、ブロックへ変換します。

「クラシック」の部分をクリックすると下記のように「ブロックへ変換」と表示されます。

そして「ブロックへ変換」をクリックすると、少しわかりづらいかもしれませんが下記の様にブロックエディタのツールボックスが表示される様になります。

これでこの記事もブロック形式へ変換されました。

というわけで WordPress のアップデートは一旦以上です!

レンタルサーバーの大クセPythonは要注意!実際使えるのは〇〇

Python を実際にサーバーで実行したいと思っているそこのあなた。

サーバー選びは迷いますよね。

実はレンタルサーバーで Python を使うにはハードルがたくさんあるのをご存知ですか?というか最悪 Python の実行にすら辿りつかない事もあるのをご存知ですか?

当サイトでは公式サイトでは分からない部分を実際に触って検証したので参考にしてください。

また、先に最終的なおすすめを発表しておくとXREAVPSになりますが、その理由もこの記事で説明していきます。

レンタルサーバーの Python の注意点

レンタルサーバーの公式サイトを見ると仕様欄に Python3 や MySQL が入っているので、何となく Python でプログラムを組みつつ MySQL のデータベースも使えてしまう様な気がしてきます。

が、実際使ってみるとそうもいきません。一つずつ見ていきましょう。

1. SSH 接続できないかも

まず SSH 接続が出来るかどうかの確認です。

SSH 接続というのを念のため簡単に説明しておくと、Windowsのコマンドプロンプトや Mac のターミナルなどを使ってサーバーを遠隔操作する方法です。

つまり SSH 接続が出来ないとせっかく借りたサーバーの Python の実行やパッケージのインストールなど、何も出来ません。

ほとんどの共用サーバーは SSH 接続可能なので、ここはそこまで心配いらないと思いきや、スターサーバーでは SSH 接続出来ません。要注意です。

なぜ公式サイトで「Python」の記載があったのか分かりません。

XREAロリポップエックスサーバーコアサーバーConoha WINGバリューサーバースターサーバー
SSH 接続パスワードパスワード公開鍵公開鍵公開鍵パスワードNG

2. 仮想環境か使えないかも

次は Python の仮想環境が使えるかどうかの確認です。

仮想環境とは
例えば自分のパソコンに Python が入っていて、その中でスクレイピングのプログラムウェブサイト制作のプログラムの2つを作るとします。

それぞれのプログラムに必要なパッケージをインストールしていくと、どのパッケージがどちらのプログラムに使われているのか分からなくなったり、パッケージのアップデートなどでプログラム間の互換性が保てなくなることもあります。

この状況を整理するため、スクレイピング用の実行環境とウェブサイト制作用の実行環境を別々で作り、それぞれの中に必要なパッケージをインストールすることでお互いの干渉を防ぐのが仮想環境です。

これは公式サイトの仕様欄などを見ただけではわからないので、実際にコマンドを実行して確認してみました。

結果、そもそも SSH 接続も出来なかったスターサーバーに加え、バリューサーバーも仮想環境の作成ができませんでした。

逆に、それ以外のサーバーは問題なく仮想環境の作成ができました。

XREAロリポップエックスサーバーコアサーバーConoha WINGバリューサーバースターサーバー
SSH 接続パスワードパスワード公開鍵公開鍵公開鍵パスワードNG
仮想環境OKOKOKOKOKNG--

3. データベースが操作できないかも

レンタルサーバーで Python を使う際、最も気をつけなければならないのがPython でデータベースを使えるサーバーが少ないということです。

大抵のレンタルサーバーは WordPress に対する互換性が素晴らしく、数クリックで簡単にMySQL のデータベースが作成できることがほとんどですが、「Python でデータベースを操作する」となると話は別です。

mysqlclient モジュールのインストールが出来ない場合がある

共用サーバーで使用できるデータベースはほとんどの場合 MySQL ですが、Python で MySQL のデータベースを操作する場合は、mysqlclient モジュールをインストールする必要があります。

実際にコマンドを実行して確認してみた結果、バリューサーバーやエックスサーバーなどでは mysqlclient のインストールで失敗しますし、ロリポップではサーバーに直接インストールはできるのに仮想環境で出来ないというクセもあります。

これも公式サイトの仕様欄などを見ただけではわからないので要注意です。

XREAロリポップエックスサーバーコアサーバーConoha WINGバリューサーバースターサーバー
SSH 接続パスワードパスワード公開鍵公開鍵公開鍵パスワードNG
仮想環境OKOKOKOKOKNG--
MySQLdbOKOK*不明*OK*不明NG--

また、上記の確認でデータベースを使えたとしても、レンタルサーバー特有の制限がかかっていて契約したレンタルサーバーからしかアクセスできない場合もありますので気をつけてください。

つまり自分のパソコンからは操作できず、データベースを操作するスクリプトをレンタルサーバーに置いてそのスクリプトを実行するという様な回りくどい事をする羽目になります。

レンタルサーバー x Python ならほぼ XREA 一択

はい、というわけで SSH接続、仮想環境、MySQLdb 全て考慮すると、一番問題なく使えるのは XREA です。

XREA
公式サイトXREA
OSLinux (CentOS)
Python のバージョンPython2, Python3
データベース個数XREA Free:1
XREA Plus:5
CRONXREA Free:なし
XREA Plus:あり(個数不明)
ウェブ上の関連記事数多い
おすすめプランXREA Plus
(月額 210 円〜 + 初期費用 0 円)
無料お試し期間7 日間

ロリポップコアサーバーエックスサーバーに関しては SSH 接続と仮想環境の作成は問題ないですが、MySQLdb モジュールの使用に難ありです。

バリューサーバースターサーバーに関しては 仮想環境の作成も出来ないので Python の使用に関してはお勧めしません

その他の参考情報

ここまでで使えるサーバーがだいぶ絞られてしまいましたが、一応使えるデータベースの個数、CRON の個数、関連記事数も確認しましたので記載します。

1. 作成可能なデータベースの個数

Python でスクレイピングした情報など、データベースに保存したりデータベースから取り出したりする必要があります。その際、用途によってデータベースを分けたい場合もあると思いますので、作成可能なデータベースの個数も気にするといいと思います。

2. CRON の個数

CRON は指定した日時によって定期的にプログラムやスクリプトを実行できる機能です。スクレイピングやデータベースの更新など、CRON を使うと便利な場面が多いと思いますが、プランによって同時に設定できる CRON の個数が決まっているのでサーバーを選ぶ際には注目するといいと思います。

3. ウェブ上の関連記事数

サーバーの中で作業をしていく中で、必ず何かしらのエラーが起きて検索する必要があるのが常なので、検索した時にどの程度情報が出てくるかも大事なポイントです。検索結果の数も目安として掲載しますので参考にしてみてください。

ちなみに無料お試し期間があるサーバーも多いので、その間に Python3 を実際に試してみるのもありです。

各レンタルサーバーの検証内容

XREAロリポップエックスサーバーコアサーバーConoha WINGバリューサーバースターサーバー
Python バージョン2.x/3.x2.7/3.72.7/3.4/3.62.x/3.x2.7/3,62.7/3.62.7/3.4/3.6
SSH 接続パスワードパスワード公開鍵公開鍵公開鍵パスワードNG
仮想環境OKOKOKOKOKNG--
MySQLdbOKOK*不明*不明*不明NG--
データベース上限550無制限無制限無制限無制限30
CRON 上限個数不明10無制限不明不明9910
関連記事数多いかなり多いかなり多いかなり少ない多いかなり少ないかなり少ない
おすすめプランXREA PlusスタンダードスタンダードCORE-Xベーシックスタンダードスタンダード

1. XREA

XREA
公式サイトXREA
OSLinux (CentOS)
Python のバージョンPython2, Python3
データベース個数XREA Free:1
XREA Plus:5
CRONXREA Free:なし
XREA Plus:あり(個数不明)
ウェブ上の関連記事数多い
おすすめプランXREA Plus
(月額 210 円〜 + 初期費用 0 円)
無料お試し期間7 日間

SSH 接続

こちらはパスワードベースで SSH にログイン可能なので SSH 接続が簡単です。

Python 仮想環境

下記 4 行のコマンドだけで pip3 を使える状態の Python3 を起動できます。

$ bash
$ python3 -m venv python3-venv
$ source python3-venv/bin/activate
(python3-venv) $ python
>>> 

ただ、デフォルトのシェルが rbash でかなり制限があるので、SSH 接続したら初めにコマンド「bash」を実行する必要があります。上のスクリプトの1行目で「bash」と入力しているのがそれです。

MySQL モジュールの使用

上記に続けて下記を順に実行していけば仮想環境内で MySQLdb モジュールを使うこともできます。

>>> exit()
$ pip install mysqlclient
$ python
>>> import MySQLdb
>>> 

ウェブ上の関連記事数

「"XREA" "python3"」での検索結果は 5,020 件で、上の2つに比べると少ないですが、これでもよく調べれば普通の使い方には対応できるのではと思います。

おすすめプラン

XREA Free は無料ですが CRON が使えませんし、データベースも 1 つしか持てません。XREA Plus は CRON も使えてデータベースも 5 個まで作れるのでおすすめです。

利用開始するにはバリュードメインのアカウント(無料)作成も必要です。

公式サイトXREA

2. ロリポップ

ロリポップ!
公式サイトロリポップ!
OSLinux (CentOS)
Python のバージョンPython2.7, Python3.7
データベース個数ライトプラン:1
スタンダードプラン:50
CRON 個数ライトプラン:5
スタンダードプラン:10
ウェブ上の関連記事数かなり多い
おすすめプランスタンダード
(月額 440 円〜 + 初期費用 0 円)
無料お試し期間10 日間

SSH 接続

こちらも SSH へのログインはパスワードベースでなので分かりやすいです。

Python 仮想環境

SSH ログイン後はエックスサーバーと同じく下記 3 行のコマンドだけで pip3 を使える状態の Python3 を起動できました。本気で SSH ログインから 10 秒で Python3 を起動できます。

$ python3 -m venv python3-venv
$ source python3-venv/bin/activate
(python3-venv) $ python
>>> 

MySQL モジュールの使用

ただ、仮想環境内では MySQLdb モジュールがインストール出来ませんでした。仮想環境を作らずに Python3 を使うのであれば MySQLdb はすでに使えます。

$ python3
>>> import MySQLdb
>>> 

仮想環境外で追加パッケージをインストールする場合は「python3 -m pip install パッケージ名」でできる様です。

ウェブ上の関連記事数

「"ロリポップ" "python3"」での検索結果は 18,200 件と、こちらも多くの情報がすでにネット上に存在しています。

おすすめプラン

ライトだとMySQLデータベース1つしか作れないので、50個まで作れる「スタンダード」プランが良いと思います。

CRON もスタンダードプランであれば 10 個まで設定可能です。

こちらも無料お試し時にはクレジットカード情報などの入力は不要です。

公式サイトロリポップ!

3. エックスサーバー

エックスサーバー
公式サイトエックスサーバー
OSLinux
Python のバージョンPython2.7, Python3.4, Python3.6
データベース個数全プラン無制限
CRON 個数全プラン無制限
ウェブ上の関連記事数かなり多い
おすすめプランスタンダード
(月額 990 円 + 初期費用 3,300 円)
無料お試し期間10 日間

SSH 接続

SSH への接続は公開鍵認証の設定が必要で少し面倒ではあります。

Python 仮想環境

SSH ログインさえ出来れば下記のコマンドで pip3 を使える状態の Python3 を起動できます。

$ python3 -m venv python3-venv
$ source python3-venv/bin/activate
(python3-venv) $ python
>>> 

MySQLdb モジュールの使用

MySQLdb モジュールを使った MySQL の操作ですが、mysqlclient パッケージのインストールに失敗するという情報があります。

ウェブ上の関連記事数

「"エックスサーバー" "python3"」での検索結果は 12,500 件程度と、多くの情報がすでに存在しているので心強いです。

おすすめプラン

基本的な違いはディスクスペースの容量と無料独自ドメインの対象くらいなので「スタンダード」プランで充分だと思います。無料お試しに申し込んでもその時点ではクレジットカード情報などの入力が必要ないのも安心です。

CRON の個数は無制限です。データベースの個数も無制限です。すごいですね。

公式サイトエックスサーバー

4. コアサーバー

コアサーバー
公式サイトコアサーバー
OSLinux
Python のバージョンPython2, Python3
データベース個数全プラン無制限
CRON全プランあり(個数不明)
ウェブ上の関連記事数かなり少ない
おすすめプランCORE-X
(月額 399 円〜 + 初期費用 1,650 円)
無料お試し期間30 日間

SSH 接続

SSH への接続は公開鍵認証の設定が必要で少し面倒です。

Python 仮想環境

SSH ログイン後は他のサーバーと同じ様に「python3 -m venv 任意の仮想環境名」で仮想環境を作成できます。

$ python3 -m venv python3-venv
$ source python3-venv/bin/activate
(python3-venv) $ python
>>> 

ウェブ上の関連記事数

「"コアサーバー" "python3"」での検索結果は 500 件程度で、かなり少ない状態です。何か問題が起こったとき、まだ解決方法がネット上に載っていない場合も考えられます。

おすすめプラン

全プランで CRON あり、データベースの個数も無制限です。CORE-Xプランで十分足りると思います。

公式サイトコアサーバー

5. ConoHa WING

ConoHa WING
公式サイトConoHa WING
OSLinux (CentOS)
Python のバージョンPython2.7, Python3,6
データベース個数全プラン無制限
CRONあり(対象プラン及び個数不明)
ウェブ上の関連記事数多い
おすすめプランベーシック
(月額 740 円〜 + 初期費用 0 円)
無料お試し期間無し

SSH 接続

SSH への接続は公開鍵認証の設定が必要で少し面倒ではあります。

Python 仮想環境

SSH ログインさえ出来れば下記のコマンドで pip3 を使える状態の Python3 を起動できます。

$ python3 -m venv python3-venv
$ source python3-venv/bin/activate
(python3-venv) $ python
>>> 

ウェブ上の関連記事数

「"ConoHa WING" "python3"」での検索結果は 1,930 件で少し少ないかと思います。

おすすめプラン

データベースの個数は全プランで無制限です。 CRON は「ジョブスケジューラー」という名前で提供されていますが、個数はわかりませんでした。ベーシックプランがおすすめです。

公式サイトConoHa WING

6. バリューサーバー

バリューサーバー
公式サイトバリューサーバー
OSLinux
Python のバージョンPython2.7, Python3.6
データベース個数エコプラン:1
スタンダードプラン:無制限
CRON 個数エコプラン:10
スタンダードプラン:99
ウェブ上の関連記事数かなり少ない
おすすめプランスタンダード
(月額 367 円〜 + 初期費用 0 円)
無料お試し期間10 日間

SSH 接続

こちらもパスワードベースで SSH にログイン可能なので SSH 接続が簡単ですし、「python」でも「python3」でも Python3 が実行されるのも便利です。(Python2 の起動はコマンド python2 を実行)

Python 仮想環境

が、なぜか Python 仮想環境の作成時にエラーが発生します。

$ python3 -m venv python3-venv
Error: Command '['/virtual/アカウント名/python3-venv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 2.

仮想環境外で mysqlclient をインストールしようとしてもエラーが発生するので、残念ながら Python の使用に関しては避けた方がいいかもしれません。

公式サイトバリューサーバー

7. スターサーバー

スターサーバー
公式サイトスターサーバー
OSLinux
Python のバージョンPython2.7, Python3.4, Python3.6
データベース個数ライト:1
スタンダード:30
CRON 個数ライト:5
スタンダード:10
ウェブ上の関連記事数かなり少ない
おすすめプランスタンダード
(月額 440 円〜 + 初期費用 0 円)
無料お試し期間14 日間

SSH 接続

何とスターサーバーは SSH 接続が出来ない仕様になっています。なので Python のコマンド操作なども出来ません。

公式サイトスターサーバー

おすすめは XREA

いかがでしたか?

学習も兼ねて Python を少しいじってみたいという場合は、既存の情報が多い上に SSH 接続、Python3 の実行、仮想環境の作成と全て問題なくできた XREA がおすすめです。

もし自分でも試したい場合は大体のレンタルサーバーが無料お試し期間を設けているので利用してみると良いかもしれません。お試し期間は基本的にクレジットカード情報など入力不要なので安心です。

更なるおすすめは VPS

最後に繰り返しになりますが、Python でプログラミングをしていくのであればレンタルサーバーよりも VPS がおすすめです。絶対に。

下記の記事もチェックしてみてください。ご自身のためにも。

▶︎レンタルサーバーで Python は茨の道!VPS が楽得でおすすめ

【番外編】さくらレンタルで無理やり Python 3 と MySQL を使う

ちなみにさくらのレンタルサーバーはそもそも Python 2しか入っていないのでこの記事にも載せていないんですが(現在の推奨は Python 3 で Python 2 は非推奨)一応 Python 3 をインストールして仮想環境で MySQLdb をインストールすることも出来ました。

めんどくさすぎたので正直全くお勧めしないですが、気合いで頑張りたい方々のために一応貼っておきます。

さくらレンタルサーバーで Python3 を再インストール

さくらのレンタルサーバに一度 Python3 をインストールしたのですが、mysqlclient をインストールするために Python3 を入れ直す必要があったのでそのステップを書きます。

▶︎さくらのレンタルサーバ スタンダードのお申込みはこちら(公式ページ)

また、Python の利用には VPS の方が圧倒的におすすめなので下記の記事も参考にしてみてください。

▶︎レンタルサーバーで Python は茨の道!VPS が楽得でおすすめ

では再インストールのステップを書いていきます。

アンインストール(仮)

まずは既存の Python3 を一旦アンインストールします。インストール先のフォルダを削除する必要があると思いますが、削除は怖いので一旦フォルダ名だけ変えます。

下記の通りパスが通っている状態です。

% which python3
/home/abcabc/local/python/bin/python3
% which pip3
/home/abcabc/local/python/bin/pip3

フォルダ名が変わったため、パスが通っていない状態になりました。

% which python3
python3: Command not found.
% which pip3
pip3: Command not found.

ダウンロード〜インストール

ここから先は基本的に下記の記事でやった内容をなぞるだけですが、進めていきます。

ダウンロード

% mkdir -p ~/work/python3
% cd ~/work/python3
% wget --no-check-certificate https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz

解凍

% tar zxf Python-3.9.0.tgz

インストール

% cd ./Python-3.9.0
% ./configure --prefix=$HOME/local/python/ --with-system-ffi LDFLAGS="-L $HOME/local/lib/" CPPFLAGS="-I $HOME/local/include/"
%  make
%  make install

ここまで完了したら、以前通したパスが生きているので下記の通り which コマンドで既に確認できる状態です。

% which python3
/home/abcabc/local/python/bin/python3
% which pip3
/home/abcabc/local/python/bin/pip3

使い終わったフォルダとファイルの削除

最後にファイルダウンロード用に作ったフォルダと、既存の Python3 が入っていたフォルダ(の名前を変えたもの)を削除します。

% rm -r ~/work/python3
% rm -r ~/local/python_20210103

ついでに

環境変数の追加

初めて Python3 をインストールした時はスルーしていましたが、どうやら下記を .cshrc に追記した方が良いみたいなのでこのタイミングで追記しておきます。

setenv  PYTHON $HOME/local/python/lib
setenv  PYTHONPATH $HOME/local/python/lib/python3.9/site-packages

requests モジュールをインストール

元々インストールしてあった requests モジュールを再度インストールします。

% pip3 install requests

▶︎さくらのレンタルサーバ スタンダードのお申込みはこちら(公式ページ)

▶︎初めから Python3 系を使えるレンタルサーバー 7 選

【Python3】_ctypes と libffi のインストールに苦しんだ記録

経緯

さくらのレンタルサーバ上で MySQL のデータベースを使えるので、それを Python で操作したいと思ったのが始まりです。

mysqlclient を使えば良いらしかったので「pip3 install mysqlclient」を実行するも、エラーが出て成功しない。

なんとかインストールを終えるまでの過程が文系の私には?だいぶややこしかったのでその記録を書き留めます。

  1. 問題発生1(No module named '_ctypes')
  2. 調査と原因1(libffi が無い)
  3. libffi をインストール(sudo は使えない)
  4. 問題発生2(INFO: Could not locate ffi libs and/or headers)
  5. 調査と原因2(./configure 文の修正)
  6. 解決(mysqlclient インストール成功)

問題発生1(No module named '_ctypes')

上記の通り「pip3 install mysqlclient」を実行したところ、下記のエラーが出てインストールが失敗しました。

ModuleNotFoundError: No module named '_ctypes'

直訳すると「_ctypes モジュールがありません」

_ctypes モジュールとはなんぞや。そしてそれはどこにあるのでしょうか。。。

調査と原因1(libffi が無い)

取り敢えず知識ゼロから出来ることは、情報の海に身を投げてなんとなくわかるまで溺れること。。。調べた結果断片的ですが自分の理解できる範囲で下記の情報が得られました。

  • _ctypes と libffi
    • _ctypes は C 言語で書かれたライブラリを Python から利用するためのモジュールであり、libffiに依存している。
    • ソースからPythonをビルドする際、libffiが見つからない場合は _ctypes のビルドはスキップされる。
    • _ctypes がビルドされていない Python から _ctypes を利用しようとすると、当該エラー(ModuleNotFoundError: No module named '_ctypes')が発生する。
  • 原因
    • つまり、libffi がインストールされていない状態で Python をインストールしたため、_ctypes のビルドがされていなかった。
  • 解決方法
    • 当該エラーを解消するには、libffi をインストールした上で Python を再ビルド・再インストールする必要がある。

libffi をインストール(sudo は使えない)

「sudo apt-get install -y libffi-dev」というコマンドが出てきましたが、さくらのレンタルサーバー(スタンダード)では管理者権限が与えられていないので sudo が使えません。

% sudo apt-get install -y libffi-dev
/usr/local/bin/sudo: Permission denied.

この通り、拒否されてしまいます。諸々調べた結果下記の方法でインストール出来ました。

問題発生2(INFO: Could not locate ffi libs and/or headers)

めでたく libffi をインストール出来たので Python をインストールし直しました。が、念のため make のログを確認したところ下記を発見。

INFO: Could not locate ffi libs and/or headers

Failed to build these modules:
_ctypes               _zoneinfo 

直訳すると「ffi libs およびヘッダーが見つからず _ctypes モジュールと _zoneinfo モジュールをビルド出来ませんでした。」とのこと。ショック。

しょうがないのでとりあえず続けて make install しましたが、当然 _ctypes モジュールが無いので「pip3 install mysqlclient」を実行しても前回と全く同じエラーで失敗します。

ModuleNotFoundError: No module named '_ctypes'

調査と原因2(./configure 文の修正)

また海に放り出されました。今回は「INFO: Could not locate ffi libs and/or headers」の文言を頼りに調べました。

こちらのページ(英語)を見たところ、どうやら CPPFLAGS、LDFLAGS、PKG_CONFIG_PATH の設定が必要みたいです。PKG_CONFIG_PATH の設定は libffi のインストールの時に行っていたので、取り敢えず CPPFLAGS と LGFLAGS だけでやってみます。

python-3.9.0.tgz は残して他を消し、再度下記の「./configure」文で Python のインストールを試してみます。

./configure --prefix=$HOME/local/python/ --with-system-ffi LDFLAGS="-L $HOME/local/lib/" CPPFLAGS="-I $HOME/local/include/"
項目雑なメモ
--prefixPython3 をインストールする場所
--with-system-ffilibffi のシステムバージョンへの接続を有効にするスイッチ。
CPPFLAGSCプリプロセッサのオプション
include パスを入れるっぽい?
LDFLAGSリンク用のディレクトリを指定する。
lib フォルダを入れるっぽい?

解決(mysqlclient インストール成功)

上記の「./configure」文のあとで make を実行しました。そしてログを確認すると下記の通り _ctypes のエラーはなくなりました。_zoneinfo は何かよくわかりませんし特に今回必要だとも思ってないので無視します。

Failed to build these modules:
_zoneinfo

今回は「pip3 install mysqlclient」も無事成功しました。

% pip3 install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-2.0.3.tar.gz (88 kB)
Using legacy 'setup.py install' for mysqlclient, since package 'wheel' is not installed.
Installing collected packages: mysqlclient
    Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-2.0.3
WARNING: You are using pip version 20.2.3; however, version 20.3.3 is available.
You should consider upgrading via the '/home/xxxxxx/local/python/bin/python3.9 -m pip install --upgrade pip' command.
% 

さくらレンタルサーバーに libffi をインストールする

  1. SSH でサーバーに接続
  2. ファイルのダウンロードと解凍
  3. インストール
  4. インストール後の設定

SSH でサーバーに接続

% ssh abcabc@abcabc.sakura.ne.jp
abcabc@abcabc.sakura.ne.jp's password: 

ファイルのダウンロードと解凍

ダウンロード用のフォルダを作成

ファイルをダウンロードする前に、ダウンロード用のフォルダを作ります。下記のコマンドで「work」フォルダとその配下に「libffi」フォルダを作成します。

% mkdir -p ~/work/libffi

wget でファイルをダウンロード

作成した「libffi」フォルダに移動して、圧縮ファイルをダウンロードします。

% cd work/libffi
% wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz

*初めは最新の「libffi-3.3.tar.gz」で進めたのですが後述の make のところで下記のエラーを返され、すぐに原因も分からなかったので一旦全部ファイルを削除して「libffi-3.2.1.tar.gz」で再チャレンジしました。

gcc: warning: '-x assembler-with-cpp' after last input file has no effect
gcc: No input files specified
*** [libffi.map] Error code 1

上記の wget コマンドを実行してから ls を実行すると圧縮ファイルがダウンロードされたのが確認できます。

% ls
libffi-3.2.1.tar.gz
% 

ファイルを解凍する

ダウンロードした圧縮ファイルを解凍します。

% tar xvfz libffi-3.2.1.tar.gz

ファイルが解凍され、元々ダウンロードした圧縮ファイルとは別に「libffi-3.2.1」という名前のフォルダが作成されています。

インストール

「libffi-3.2.1」のフォルダへ移動し ./configure を実行します。prefix でインストール先を指定します。

% cd libffi-3.2.1
% ./configure --prefix=$HOME/local/libffi/3_2_1

実行するとプロセスが走ってドバドバとターミナルに表示されるので入力待ちになるのを待ちます。

make そして make install を順に実行します。

% make
% make install

.configure の prefix で指定した場所にインストールされました。

インストール後の設定

シンボリックリンクの作成

% mkdir -p ~/local/include
% ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h $HOME/local/include/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/local/include/

% mkdir -p ~/local/lib
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.a $HOME/local/lib/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.la $HOME/local/lib/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.so $HOME/local/lib/
% ln -s $HOME/local/libffi/3_2_1/lib/libffi.so.6 $HOME/local/lib/

% mkdir -p ~/local/lib/pkgconfig/
% ln -s $HOME/local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/local/lib/pkgconfig/

上記を実行すると下記の様に local 配下に include、lib、lib > pkgconfig が作成され、その配下のシンボリックリンクも確認できます。

環境変数の設定

シンボリックリンクを作成したのでそれぞれ LD_LIBRARY_PATH と PKG_CONFIG_PATH に追加します。他のソースをビルドするときやコマンド実行するときに役立ちます。

シェルの種類ユーザプロファイル
Bourne シェル (sh) または Korn シェル (ksh).profile
Bourne Again シェル (bash).bash_profile
C シェル (csh).login と .cshrc
TC シェル (tcsh).tcshrc と .cshrc
Z シェル (zsh).zlogin と .zshrc

今回はサーバーのシェルが csh なので .cshrc を編集して環境変数を設定します。

.cshrc の編集

% cd ~/
% vi .cshrc

.cshrc に下記を追記します。

setenv  LD_LIBRARY_PATH $HOME/local/lib
setenv  PKG_CONFIG_PATH $HOME/local/lib/pkgconfig

.cshrc で追記した内容を反映させます。

% source ~/.cshrc
% rehash

echo コマンドで確認すると、指定したパスが表示されます。

% echo $LD_LIBRARY_PATH
/home/abcabc/local/lib
% echo $PKG_CONFIG_PATH
/home/abcabc/local/lib/pkgconfig

以上で libffi のインストール作業は完了です。

LD_LIBRARY_PATH と PKG_CONFIG_PATH

LD_LIBRARY_PATH 変数

LD_LIBRARY_PATHは、アプリケーションがリンクされている動的共有ライブラリを検索する際の対象ディレクトリを動的リンクローダーに指示します。複数のディレクトリをコロン (:) で区切ったもので、コンパイルされた検索パスと標準の場所(大抵 /lib、/usr/lib 等)の前に検索されます。

PKG_CONFIG_PATH 変数

pkg-config は、プログラムのコンパイルとシステムにインストールされているライブラリとの接続に必要な情報を提供します。
この情報は .pc ファイルに保存されており、pkg-config ツールで認識されている特定の場所にあります。

pkg-config が .pc ファイルを検索する際、デフォルトでは /usr/lib/pkgconfig と /usr/share/pkgconfig を検索します。しかし、一部のローカルモジュールは /usr/local などの別のプレフィックスにインストールされる場合があるため、PKG_CONFIG_PATH 変数で検索対象のパスを追加します。