【Python講座 最終回】自動化システム構築。初心者がVPSとCronで作る「24時間働く完全自動ボット」

そのプログラム、あなたが起動ボタンを押すのですか?

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
ついに、この「初心者向けPython講座」も最終回を迎えました。

これまでの全7回で、あなたは以下のスキルを身につけました。

今のあなたは、「コマンドを叩けば、データを集めて保存するプログラム」を作ることができます。
しかし、毎日決まった時間にコマンドを叩くのは面倒ですし、寝ている間や旅行中は実行できません。

最終回のテーマは「自動化(Automation)」です。
Linuxサーバー(VPS)の標準機能である「Cron(クーロン)」を使い、あなたがPCを閉じていても勝手に動き続ける「完全自動化システム」を構築します。

コウ君

先生、ここまで長かったですが、ついにラストですね!
「自動化」ってエンジニアっぽくて憧れます。
でも、勝手に動くってことは、エラーが出ても気づかないんじゃ…?

リナックス先生

良い視点ね、コウ君。
自動化システムは「動いて当たり前、止まったら大事故」の世界よ。
だからこそ、第7回で学んだ「ログ」が重要なの。
今回は、プロが現場でハマりやすい「Cronのパス問題」や「エラー通知」の仕組みもしっかり解説して、有終の美を飾るわよ!

本記事では、これまでの集大成として、実機(VPS)上で稼働する自動ニュース収集ボットを完成させます。


1. 定期実行の仕組み「Cron」とは?

Cron(クーロン)は、LinuxなどのUNIX系OSに標準搭載されている「タスクスケジューラ」です。
Windowsでいう「タスクスケジューラ」と同じ役割を果たします。

  • 「毎朝 7:00 に実行」
  • 「1時間ごとに実行」
  • 「毎月1日の 0:00 に実行」

といった細かいスケジュール設定が可能で、サーバーサイドエンジニアにとっては呼吸をするように使う必須ツールです。

VPSでの準備

AlmaLinux 9には通常デフォルトでインストールされていますが、念のため確認・起動しておきましょう。
(※root権限、またはsudoで実行)

# インストール確認
dnf install -y cronie

# 起動と自動起動設定
systemctl enable --now crond

# ステータス確認(Active: active (running) ならOK)
systemctl status crond

2. 実践:Cronで動くPythonスクリプトの作成

前回作成したニュース収集スクリプトを、自動実行向けに少し改良します。
ここで重要なのが「ディレクトリ(パス)の問題」です。

2-1. 絶対パスでファイルを指定する

手動で実行する時は cd ~/python_study で移動してから実行していましたが、Cronは特定の場所から実行されるわけではありません。
そのため、プログラム内でファイル(CSVやログ)を読み書きする際は、「絶対パス」を使うか、「スクリプトのある場所を基準」にする必要があります。

auto_news.py を作成します。

import requests
from bs4 import BeautifulSoup
import csv
import logging
import datetime
import os

# --- 【重要】パスの解決 ---
# このスクリプトがあるディレクトリの絶対パスを取得
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# ログファイルとCSVファイルのパスを結合
LOG_FILE = os.path.join(BASE_DIR, 'auto_crawler.log')
CSV_FILE = os.path.join(BASE_DIR, 'python_news.csv')

# ログ設定
logging.basicConfig(
    filename=LOG_FILE,
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    encoding='utf-8'
)

def save_to_csv(data_list):
    try:
        # CSVファイルも絶対パスで指定
        with open(CSV_FILE, "a", encoding="utf-8", newline='') as f:
            writer = csv.writer(f)
            today = datetime.date.today()
            for title, url in data_list:
                writer.writerow([today, title, url])
        logging.info(f"{len(data_list)}件保存完了")
    except Exception as e:
        logging.error(f"CSV保存エラー: {e}")

def main():
    logging.info("自動クローラー処理開始")
    url = "https://www.python.org/"
    
    try:
        response = requests.get(url)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, "html.parser")
        news_elements = soup.select(".blog-widget li a")
        
        extracted_data = []
        for news in news_elements[:5]:
            title = news.text.strip()
            link = news.get("href")
            extracted_data.append([title, link])
            
        save_to_csv(extracted_data)
        
    except Exception as e:
        logging.error(f"スクレイピングエラー: {e}")
    
    logging.info("自動クローラー処理終了")

if __name__ == "__main__":
    main()

os.path.dirname(os.path.abspath(__file__)) という呪文を使うことで、どこから実行されても「スクリプトと同じフォルダ」を基準にファイル操作ができるようになります。


3. Cronの設定方法と記述ルール

スクリプトの準備ができたら、Cronに登録します。

3-1. Pythonの絶対パスを確認する

Cronでは source .venv/bin/activate というコマンドは使いにくいです。
代わりに、仮想環境内のPython実行ファイルの絶対パスを直接指定します。

# 仮想環境に入った状態で実行
which python
# 出力例: /home/python_user/python_study/.venv/bin/python

このパス(/home/python_user/.../bin/python)をメモしておいてください。

3-2. crontabの設定

以下のコマンドで設定ファイルを開きます。

crontab -e

vi エディタが開くので、以下の形式で記述します。

書式: 分 時 日 月 曜日 コマンド

例として、「5分おきにスクリプトを実行する」設定を書きます。

*/5 * * * * /home/python_user/python_study/.venv/bin/python /home/python_user/python_study/auto_news.py
  • */5 : 5分ごとに実行
  • * * * * : 毎時、毎日、毎月、全曜日
  • /.../bin/python : Pythonのフルパス
  • /.../auto_news.py : スクリプトのフルパス

記述したら保存して終了します(:wq)。

3-3. 動作確認

crontab -l で登録内容を確認できます。
5分ほど待ってから、ログファイルが生成されているか確認しましょう。

ls -l ~/python_study/
cat ~/python_study/auto_crawler.log

ログに「自動クローラー処理開始」などが追記されていれば成功です!


4. プロのノウハウ:Cron運用の3つの落とし穴

Cronは便利ですが、ハマりポイントが多いツールでもあります。
初心者が必ず直面するトラブルと対策を紹介します。

① 環境変数が読み込まれない

Cron実行時は、通常のシェル(ログイン時)とは違い、環境変数(PATHなど)がほとんど設定されていません。
APIキーなどを .bash_profile に書いていても読み込まれないため、Pythonコード内で python-dotenv を使って .envファイルを絶対パスで読み込む などの対策が必要です。

② printの出力先がない

Cronで実行中の print() は、画面がないため行き場を失います。
通常はメールで通知されますが、VPSではメールサーバーの設定をしていないことが多いため、闇に消えます。
対策として、ログファイルへの出力(logging)を使うか、Cron設定で標準出力をファイルに向けます。

# 末尾に追記することで、printの内容もcron.logに保存される
*/5 * * * * ...python ...py >> /home/python_user/cron.log 2>&1

③ 実行ユーザーの権限

rootユーザーで crontab -e をしてしまい、生成されたファイルが root 権限になってしまって、一般ユーザーから編集や削除ができなくなるケースがあります。
必ず 実行させたいユーザー(python_user)でログインして crontab -e を実行しましょう。

💡 便利なツール:Crontab.guru
Cronの日時設定は複雑です。「Crontab.guru」というWebサイトを使うと、「0 9 * * 1(毎週月曜の朝9時)」のように、設定値の意味を日本語(英語)で確認できます。おすすめです。


5. 演習問題:毎朝8時に天気を記録する完全自動ボット

講座の総決算です。
第6回で作成した天気取得コードを改良し、Cronで毎朝8時に実行して、CSVに気温を記録し続けるシステムを構築してください。

【課題】

  1. daily_weather.py を作成する。
  2. os.path を使ってパス問題を解決する。
  3. Open-Meteo APIから東京の気温を取得する。
  4. weather_log.csv に「日時、気温、風速」を追記する。
  5. Cronに「毎日朝8時0分」に実行する設定を追加する。

解答例 (daily_weather.py)

※コードは長くなるため要点のみ。基本はこれまでの組み合わせです。

# (import部分は省略)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
CSV_PATH = os.path.join(BASE_DIR, 'weather_log.csv')

# (API取得ロジック...)

# CSV保存
with open(CSV_PATH, "a", newline='') as f:
    writer = csv.writer(f)
    writer.writerow([datetime.datetime.now(), temp, wind])

Cron設定

0 8 * * * /home/python_user/.../bin/python /home/python_user/.../daily_weather.py

これで、あなたは何もしていなくても、サーバーが勝手にデータを蓄積し続けてくれます。
1ヶ月後にCSVを開けば、気温の変化がグラフ化できる貴重なデータの完成です。


6. 卒業試験:これからの学習ロードマップ

全8回の講座、本当にお疲れ様でした!
あなたは今、VPS上でPythonを自在に操り、自動化システムを構築できるスキルを持っています。

しかし、エンジニアの道はここからが本番です。
さらにレベルアップするために、次に学ぶべき技術を紹介します。

分野 学ぶべき技術 理由
バージョン管理 Git / GitHub コードの履歴を管理し、チーム開発をするための必須スキル。
「間違えて消しちゃった!」を救ってくれます。
Webアプリ開発 Flask / Django Pythonで本格的なWebサイトやAPIサーバーを作る技術。
ブラウザから操作できるシステムが作れます。
環境構築 Docker 今回VPS上で苦労した環境構築を、コマンド一つで再現できる技術。
現代の開発現場では標準装備です。
データ分析 Pandas / Matplotlib 集めたCSVデータを分析し、グラフ化してインサイトを得る技術。
データサイエンティストへの道です。

まとめ:エンジニアとしての旅立ち

第8回まで完走できたあなたなら、もう「初心者」ではありません。
自力で環境を作り、エラーを乗り越え、システムを構築した経験は、現場でも必ず役に立ちます。

全8回の振り返り:

  1. VPSにPython環境を構築した。
  2. 変数と型を理解し、計算させた。
  3. if文で判断させ、for文で大量処理させた。
  4. 関数とモジュールでコードをきれいにした。
  5. pipで外部の力を借りた。
  6. ファイル操作でデータを資産化した。
  7. Cronで完全自動化を実現した。

プログラミングは、学べば学ぶほどできることが増え、世界が広がります。
この講座が、あなたのエンジニア人生の良きスタート地点になれば幸いです。

またどこかでお会いしましょう。Happy Hacking!

▼ Pythonを学ぶならVPSで ▼

AlmaLinuxが使える
「おすすめVPS」

VPSランキングを見る

Pythonスキルを活かす
「ITエンジニア転職」

転職エージェントを見る

コメント