#ChiroruLab

趣味と日々の雑記録

【スクレイピング】Pythonプログラムをサービス化し、自動起動させる方法

f:id:chiroru_27:20210119222318p:plain
前回スクレイピングが出来るようにchromiumseleniumを入れる工程をまとめました。
それは2021/01/19現在も、コピペするだけで動作する内容になっているのでもう少しパワーアップさせようと思います。

エラーで落ちたり、再起動したりすると手動で起動し直す必要がありますた。
そこで今回はもっと手軽に使えるようにするため、それをサービスとして登録し自動起動できるように設定していきます。



まずスクレイピング環境を作る

chiroru.hatenablog.com
環境構築はこちらを参照して行う。

プログラムをサービス化して自動起動させる

ユニットファイルを作る

$ sudo nano /etc/systemd/system/SNS_Bot.service
[Unit]
Description = SNS_Bot service
After=network-online.target
ConditionPathExists=/opt/SNS_Bot/bin

[Service]
ExecStart=/opt/SNS_Bot/bin/AutoStart.sh
Restart=always
Type=simple
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

所有権とアクセス権を設定

$ sudo chown root:root /etc/systemd/system/SNS_Bot.service
$ sudo chmod 644 /etc/systemd/system/SNS_Bot.service

作業用フォルダを作り、アクセス権を設定

$ sudo mkdir -p /opt/SNS_Bot/bin
$ sudo chmod 755 /opt/SNS_Bot/bin

プログラム起動用のシェルスクリプトを作る

  • -uオプションでバッファを無効にするとstatusでログを確認できる
$ sudo nano /opt/SNS_Bot/bin/AutoStart.sh
#!/bin/sh
exec /usr/bin/env python3 -u /opt/SNS_Bot/bin/Bot.py

所有権とアクセス権を設定

$ sudo chown root:root /opt/SNS_Bot/bin/AutoStart.sh
$ sudo chmod 755 /opt/SNS_Bot/bin/AutoStart.sh

systemdを変更したため更新

$ sudo systemctl daemon-reload

サービスを動かし、問題がなければ自動起動に登録

$ sudo systemctl start SNS_Bot.service
$ sudo systemctl status SNS_Bot.service
#エラーが吐かなければおk
$ sudo systemctl enable SNS_Bot.service

クラッシュエラーを吐いて止まった時;ChromeDriver is assuming that Chrome has crashed

--headlessオプションを付けて対処

#chrome options
chrome_options = Options()
chrome_options.binary_location = '/usr/bin/chromium-browser'
#サービスとして起動する場合はヘッドレスモードを指定する
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
#Webdriver
browser = webdriver.Chrome(executable_path='/usr/bin/chromedriver',options=chrome_options)

参考にしたサイト

qiita.com



Raspberry Piの可能性は凄まじい

10分あれば構築できちゃうお手軽さ、使いみち思いつかないけどもう一台欲しくなっちゃう。
以上、@chiroru_27 でした。

※インスタはスクレイピングを禁止しているため、今回のPythonコードは載せません。