(2023年12月23日追記)
Windows11のスリープ復帰からのpython定期実行について
記事を作成いたしました。
ごごちと申します。
先日、Debankをスクレイピングして
仮想通貨のログを自動取得するプログラムを紹介しました。
【仮想通貨】DebankのPythonスクレイピング結果のグラフ化!分散型取引所(DEX)の成績を比較しやすくしました!
今回は、Windows10でプログラムを
定期実行する方法を紹介します。
以下の順番で説明したいと思います。
- Windowsタスクスケジューラの起動方法
- PCのスリープ復帰タスクの定義
- スクレイピングプログラムの実行タスクの定義
- スリープ復帰→スクレイピングプログラムのスケジューリング
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定期実行について
記事を作成いたしました。
