そのプログラム、あなたが起動ボタンを押すのですか?
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
ついに、この「初心者向けPython講座」も最終回を迎えました。
これまでの全7回で、あなたは以下のスキルを身につけました。
今のあなたは、「コマンドを叩けば、データを集めて保存するプログラム」を作ることができます。
しかし、毎日決まった時間にコマンドを叩くのは面倒ですし、寝ている間や旅行中は実行できません。
最終回のテーマは「自動化(Automation)」です。
Linuxサーバー(VPS)の標準機能である「Cron(クーロン)」を使い、あなたがPCを閉じていても勝手に動き続ける「完全自動化システム」を構築します。
先生、ここまで長かったですが、ついにラストですね!
「自動化」ってエンジニアっぽくて憧れます。
でも、勝手に動くってことは、エラーが出ても気づかないんじゃ…?
良い視点ね、コウ君。
自動化システムは「動いて当たり前、止まったら大事故」の世界よ。
だからこそ、第7回で学んだ「ログ」が重要なの。
今回は、プロが現場でハマりやすい「Cronのパス問題」や「エラー通知」の仕組みもしっかり解説して、有終の美を飾るわよ!
本記事では、これまでの集大成として、実機(VPS)上で稼働する自動ニュース収集ボットを完成させます。
🚀 【全8回】Python 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に気温を記録し続けるシステムを構築してください。
【課題】
daily_weather.pyを作成する。os.pathを使ってパス問題を解決する。- Open-Meteo APIから東京の気温を取得する。
weather_log.csvに「日時、気温、風速」を追記する。- 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回の振り返り:
- VPSにPython環境を構築した。
- 変数と型を理解し、計算させた。
- if文で判断させ、for文で大量処理させた。
- 関数とモジュールでコードをきれいにした。
- pipで外部の力を借りた。
- ファイル操作でデータを資産化した。
- Cronで完全自動化を実現した。
プログラミングは、学べば学ぶほどできることが増え、世界が広がります。
この講座が、あなたのエンジニア人生の良きスタート地点になれば幸いです。
またどこかでお会いしましょう。Happy Hacking!
▼ Pythonを学ぶならVPSで ▼
AlmaLinuxが使える
「おすすめVPS」
Pythonスキルを活かす
「ITエンジニア転職」


コメント