スリープ中でもPythonスクレイピングプログラムを定期実行する方法【タスクスケジューラ】【Windows10】

(2023年12月23日追記)
Windows11のスリープ復帰からのpython定期実行について
記事を作成いたしました。

ごごちと申します。

先日、Debankをスクレイピングして
仮想通貨のログを自動取得するプログラムを紹介しました。
【仮想通貨】DebankのPythonスクレイピング結果のグラフ化!分散型取引所(DEX)の成績を比較しやすくしました!

今回は、Windows10でプログラムを
定期実行する方法を紹介します。
以下の順番で説明したいと思います。

  1. Windowsタスクスケジューラの起動方法
  2. PCのスリープ復帰タスクの定義
  3. スクレイピングプログラムの実行タスクの定義
  4. スリープ復帰→スクレイピングプログラムのスケジューリング

1. Windowsタスクスケジューラの起動方法


①左下のWindowsマークを押し、
検索欄に「タスクスケジューラ」と入力

②タスクスケジューラを押す。
Windowsマーク > Windows 管理ツール
> タスクスケジューラ
を押しても起動します。

2. PCのスリープ復帰タスクの定義

スリープ復帰は筆者もよくわからず
こちらの記事を参考に、動作するのを確認しました。
https://macruby.info/windows-10/windows10-task-scheduler-sleep-wake.html#toc9
なお筆者は、
上記の記事で紹介されているスリープ復帰した後に
ディスプレイがつく設定までは行っていませんが、
スリープ復帰後にスクレイピングプログラムが
動作することは確認しました。

電源オプションの変更


③左下のWindowsマークを押し、
検索欄に「電源プランの編集」と入力

④電源プランの編集を押す。
コントロールパネル > 電源オプション
>コンピュータがスリープ状態になる時間を変更
を押しても起動します。


⑤「詳細な電源設定の変更」を押す

⑥スリープ > スリープ解除タイマーの許可
> バッテリ駆動 : 有効、電源に接続 : 有効にする。

タスクスケジューラへのスリープ復帰タスク「Wake Up」追加

Windows PowerShell ISE からスクリプトを実行して
「Wake Up」タスクを追加します。
こちらの記事を参考にしました。
https://macruby.info/windows-10/windows10-task-scheduler-sleep-wake.html#toc9

⑦左下のWindowsマークを押し、
検索欄に「PowerShell ISE」と入力

⑧「Windows PowerShell ISE」を押す

⑨Windows PowerShell ISEを立ち上げたら、
「新規作成」アイコンを押す

⑩以下のコードをコピーして、
「新規1.ps1」にペーストする

$script = '$signature = @"
[DllImport("powrprof.dll")]
public static extern bool SetSuspendState(bool Hibernate,bool ForceCritical,bool DisableWakeEvent);
"@
$func = Add-Type -memberDefinition $signature -namespace "Win32Functions" -name "SetSuspendStateFunction" -passThru
$func::SetSuspendState($false,$true,$false)'

$bytes = [System.Text.Encoding]::Unicode.GetBytes($script)
$encodedCommand = [Convert]::ToBase64String($bytes)

$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-encodedCommand $encodedCommand"

$trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 1 -At 08:09
Register-ScheduledTask -TaskName "Sleep" -Action $action -Trigger $trigger -Force

$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c echo hello"
$settings = New-ScheduledTaskSettingsSet -WakeToRun
$trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 1 -At 08:12
Register-ScheduledTask -TaskName "WakeUp" -Action $action -Settings $settings -Trigger $trigger -Force

⑪スクリプト実行ボタンを押す

⑫タスクスケジューラに「Sleep」と「WakeUp」が定義されます。
(タスクスケジューラが開きっぱなしの場合、開き直すと表示されます。)

「Sleep」は今回使わないので、右クリック > 無効としてください。

「WakeUp」はcmd.exeを呼び出し、
echo helloを実行します。
このタスクには
「条件」タブで「スリープを解除する」
設定にチェックが入っています。
この処理を呼び出すことで、
スリープ復帰させることが出来ます。

なぜスクレイピングプログラムに
「条件」>「スリープ解除にチェック」
ではダメなのかというと、Window10では、
echo helloのような一瞬で終わるような処理でないと
スリープ解除されないのが原因だそうです。

3. スクレイピングプログラムの実行タスクの定義

スクレイピングプログラム「portfolio.py」を
定期実行するタスクを定義します。

⑬タスクスケジューラで「基本タスクの設定」を
押します。

⑭タスクの名前をつけます(上記例ではauto_log)
説明は任意です。

⑮タスクの間隔は後ほど詳細設定可能なのでそのまま「次へ」を押します。

⑯プログラムの開始にチェックを入れて「次へ」を押します

⑰プログラムの操作を以下の様に記載します。

  • プログラム/スクリプト : 仮想環境のpython.exeの絶対パス
  • 引数の追加 : 実行する.pyプログラム名
  • 開始 : 実行する.pyプログラムが存在する絶対パス

Anacondaでconda仮想環境を立ち上げている場合
仮想環境のpython.exeの絶対パスを確認するには
以下の図を参考にしてください。

⑱「完了」を押してください

4. スリープ復帰→スクレイピングプログラムのスケジューリング

最後に
スリープ復帰
→スクレイピングプログラム
のスケジューリングを行います。

スリープ解除

⑲「WakeUp」タスクを右クリックし
「プロパティ」を選択

⑳「トリガー」タブ中の
トリガーの項目をダブルクリック

㉑図のように設定します。

実行設定を「1回」にして、実行日時を指定します。
そして繰り返し間隔を「1分間」に、
継続時間を「無期限」似設定します。

繰り返し間隔の「1分間」は、
「5分間」を選択してから手入力で設定できます。

.pyプログラムの設定

㉓「auto_log」タスクを右クリックし、
「プロパティ」をクリック

㉔エクセルファイルの書き込み権限を与える場合は、
「最上位の特権で実行する」にチェック

㉕「トリガー」タブ中の
トリガーの項目をダブルクリック

㉖図のようにスケジュールを設定します。
「auto_log」タスクの開始時刻を
「WakeUp」タスクの開始時刻よりも
1分後に設定しておくと、
スリープ解除してからプログラムが動作します。

㉗「条件」タブの「スリープを解除する」にチェック
(必要ないかもしれません)

㉘「OK」を押す

テスト動作

上記の設定では、
11時59分にスリープ解除
12時0分にportfolio.py(スクレイピング)実行

と動作します。
そして1分おきに繰り返して動作します。

テスト動作の確認ができましたら、
繰り返しの間隔を自由に設定してください。

実行例:6時間間隔で実行した場合を紹介

こちらの記事で紹介したプログラム(portfolio.py)
を6時間おきに動作するようにしました。

【6時間おきに以下を定期実行】
スリープ解除
→portfolio.pyを起動

スリープ状態であっても、
DebankのProfileページをスクレイピングして
record_YYYYMMDD_HHMMSS.xlsx が生成されます。

他にもつまづいたポイント

筆者は最初スクレイピングプログラム「portfolio.py」
を定期動作させようとしたとき、
python.exeを実行するコマンドラインが
エラーメッセージを一瞬だけ表示して動作しない
という現象に直面しました。
なんとかエラーメッセージを特定したところ、
numpyをロードするときにエラーしている
とのことでした。
numpyは最新のversionをインストールしていました
(ver=1.24.xx)
いったん、numpyをアンインストールして、
ver=1.23.xxをインストールすると動作するのを確認しました。

pip uninstall numpy
pip install numpy==1.23

他にも「環境変数の設定」でPathの設定なども確認しました。
このように、つまづくポイントがいくつかあるので要注意です。

定期実行で効率化と新たな知見の発見へ!

定期実行することで日々の記録作業から解放され、
時間をより有効活用できます。

また効率化だけではなく、データを様々な角度で分析する余裕ができるので、
新たな知見の発見にもつながるのが大きな価値だと思っています。

筆者も今回の経験を活かして色んな事を効率化し、新たな知見を発信していきたいです!

(2023年12月23日追記)
Windows11のスリープ復帰からのpython定期実行について
記事を作成いたしました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA