【2026年版】PythonのAIスクレイピングツールをVPSで定期実行(cron)させる非エンジニア向けガイド
【結論を先に書く】自分がたどり着いた答え
スクレイピングの定期実行を「本当に自動化」したいなら、VPS一択です。ローカルPCでやろうとすると、スリープするたびに止まる。「じゃあスリープ切って24時間つけっぱなしに…」は精神的にずっと気になるし、何かあったらリモートデスクトップで入らなきゃいけないから全然手放しにならない。それで半年近く遠回りしました。
VPS選びについても先に書いておきます。
- 週数時間だけ動かすなら → KAGOYA CLOUD VPS(時間課金で安い)
- 1日中ほぼ動かすなら → XServer VPS(月830円固定の安心感)
- 損益分岐点は「月76時間」。これ以上使うならXServer、未満ならKAGOYAのほうが安上がり
あと、このスクレイピング用途にGPUは完全に不要です。ごくたまにGPU付きVPSを勧めてる記事を見かけますが、正直あれはアフィリエイト報酬が高い商品を売りたいだけだと思っています。テキスト取得とcron実行にGPUはいりません。無駄にお金を使わないでください。
なぜVPSが必要なのか
実体験から言うと、自分も最初はローカルPCでやろうとしていました。でも結局、こういう問題にぶつかります。
| 環境 | 問題点 |
|---|---|
| ローカルPC | PCがスリープ・シャットダウンで停止 |
| Google Colab | 無料プランは90分でセッション切れ |
| VPS | 24時間365日、cronで自動実行できる |
「PCつけっぱなしでいいじゃん」と思うかもしれないけど、寝てる間・外出中も何かあれば自分で対処しなきゃいけない。それって「自動化できてる」とは言えないんですよね。VPSに投げてしまえば、本当に放置できる。その差は体験してみないとわかりづらいんですが、一度やると戻れません。
基本スクレイピングスクリプトを作る
AIに書いてもらったスクリプトをそのままコピペするのもOKです。ただ、ログの出力先だけは最初に確認しておいてください。後で「動いてるのか動いてないのかわからない」という状況になりがちです。自分がそうでした。
BeautifulSoupによるHTML解析(静的サイト向け)
JavaScriptを使っていないシンプルなサイトならBeautifulSoupで十分です。軽いし、エラーも少ない。最初はこっちから試してみることをすすめます。
#!/usr/bin/env python3
# scraper.py
import requests
from bs4 import BeautifulSoup
import datetime
import logging
# ログ設定
logging.basicConfig(
filename="/var/log/scraper.log",
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s"
)
TARGET_URL = "https://example.com/products"
def scrape():
try:
res = requests.get(TARGET_URL, timeout=10,
headers={"User-Agent": "Mozilla/5.0"})
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
items = soup.select(".product-item")
for item in items:
name = item.select_one(".name").text.strip()
price = item.select_one(".price").text.strip()
logging.info(f"商品名: {name} | 価格: {price}")
print(f"[{datetime.datetime.now()}] {len(items)}件取得完了")
except Exception as e:
logging.error(f"エラー: {e}")
raise
if __name__ == "__main__":
scrape()
Seleniumによる動的サイトのスクレイピング
Amazonの価格やログイン後のページなど、JavaScriptで描画されるサイトはBeautifulSoupでは取れません。そういうときはSeleniumを使います。ただ、Seleniumはセットアップがちょっと面倒で、VPS上でのメモリ消費も多め。まずBeautifulSoupで試して、取れなかったときだけSeleniumに切り替えるのが現実的です。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
def scrape_dynamic():
options = Options()
options.add_argument("--headless") # 画面なしで実行
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com/")
price = driver.find_element(By.CSS_SELECTOR, ".price").text
print(f"価格: {price}")
driver.quit()
VPS上にPython環境を構築する
ここが「非エンジニアには一番ハードル高いかも」と感じるところ。でもコマンドを順番に打つだけなので、意味がわからなくてもとりあえず動きます。自分も最初は呪文を唱えてる気分でした。
# 1. パッケージ更新
sudo apt update && sudo apt upgrade -y
# 2. Python & pip インストール確認
python3 --version # 3.10以上推奨
pip3 --version
# 3. 仮想環境を作成(プロジェクトごとに分ける)
python3 -m venv ~/scraper-env
source ~/scraper-env/bin/activate
# 4. 必要ライブラリをインストール
pip install requests beautifulsoup4 selenium
# 5. Selenium用ChromeDriverインストール
sudo apt install -y chromium-browser chromium-chromedriver
仮想環境(venv)を作るのが面倒に思えるかもしれませんが、後でcronに登録するときに「どのPythonで動かすか」が明確になるので、むしろやっておいたほうがトラブルが減ります。スキップして後から詰まる人をよく見ます。
cronで定期実行を設定する
ここが本題です。cronはざっくり言うと「Linuxのタスクスケジューラー」。設定ファイルに「いつ・何を実行するか」を書くだけ。
cronの時刻指定の読み方:
分 時 日 月 曜日 コマンド
* * * * * 毎分実行
0 6 * * * 毎朝6時に実行
0 */3 * * * 3時間おきに実行
0 9 * * 1 毎週月曜9時に実行
crontabの設定手順
一番ハマりやすいのは「どのPythonを使うか」の指定ミスです。システムのpython3じゃなくて、さっき作った仮想環境のパスを書かないと、ライブラリが読み込めなくてエラーになります。自分も最初これで1時間溶かしました。
# crontabを編集(初回はエディタ選択を求められる。1でnano推奨)
crontab -e
# 以下を追記(仮想環境のPythonパスを使う点が重要)
# 毎朝8時にスクレイパーを実行
0 8 * * * /home/user/scraper-env/bin/python /home/user/scraper.py >> /var/log/scraper.log 2>&1
# 設定確認
crontab -l
ログの確認と管理
「ちゃんと動いてるのかな」が気になって毎日SSH接続するようでは、自動化した意味がない。だからログとエラー通知の設定は最初にやっておくべきです。
# リアルタイムでログを見る
tail -f /var/log/scraper.log
# 最後の20行だけ表示
tail -20 /var/log/scraper.log
# 古いログを自動削除(logrotate設定)
sudo nano /etc/logrotate.d/scraper
/var/log/scraper.log {
weekly
rotate 4
compress
missingok
notifempty
}
ログが際限なく溜まるとディスクを圧迫します。logrotateは地味だけど、長期運用するなら絶対に設定しておいてください。
エラー時にメールで通知する
エラーが起きたことに3日後に気づく、という経験を一度するとメール通知のありがたさがわかります。最初から設定しておくのが吉です。
import smtplib
from email.mime.text import MIMEText
def send_error_mail(error_message: str):
msg = MIMEText(f"スクレイパーでエラーが発生しました:\n\n{error_message}")
msg["Subject"] = "[ERROR] スクレイパー異常停止"
msg["From"] = "your@gmail.com"
msg["To"] = "your@gmail.com"
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
smtp.login("your@gmail.com", "your-app-password")
smtp.send_message(msg)
Gmailの「アプリパスワード」を使えば2段階認証環境でも送信できます。通常のパスワードは使わないでください(セキュリティリスクになります)。
まとめ:あなたの使い方で選ぶ
セットアップの手順をまとめると以下の5ステップです。
| ステップ | 内容 |
|---|---|
| 1 | VPS(2GB以上)を契約してPython環境を構築 |
| 2 | BeautifulSoup or Seleniumでスクリプトを作成 |
| 3 | /var/log/scraper.log にログを出力する設定を追加 |
| 4 | crontabで実行スケジュールを登録 |
| 5 | エラー通知メールの設定で運用を自動化 |
そして肝心の「どのVPSを選ぶか」は、使う頻度で決めてください。
| 使い方 | おすすめ | 理由 |
|---|---|---|
| 1日数回・週数時間だけ動かす | KAGOYA CLOUD VPS | 時間課金なので使った分だけ。月76時間未満ならこっちが安い |
| 1日中ほぼ回しっぱなし | XServer VPS | 月830円固定。毎月の金額を計算したくない人はこっちのほうが精神的にラク |
| まず試してみたい | KAGOYA CLOUD VPS(14日無料) | 週末が2回入るので、平日仕事でも確認する時間は十分ある |
初期設定に1〜2時間かかりますが、一度動いたら本当に放置できます。「毎日手動で確認してる時間」を考えたら、その1〜2時間は絶対に取り返せます。
迷っている時間がもったいない。動いてから考えよう。合わなければ乗り換えればいいだけの話です。