ubuntu または debian 上で Chrome と Selenium をセットアップして実行します。このガイドは ubuntu 22.04
に基づいています
Selenium は Web タスクの自動化に最適ですが、サーバー上でボットを 24 時間 365 日実行し続けるのは難しい場合があります。 systemd を使用すると、Selenium ボットをバックグラウンド サービス (デーモン) として実行でき、確実に実行され、障害時に再起動されます。このガイドでは、Linux VPS 用の構成を中心に、セットアップ手順を説明します。
Google Chrome のインストール
仮想環境のセットアップ
必要なパッケージのインストール
Python スクリプトの作成
systemd サービスのセットアップ
ブロックバッファリングの問題を修正
journalctl を使用したログへのアクセス
参考資料
まず、すべてのパッケージを更新します。
sudo apt update
安定した Google Chrome パッケージをダウンロードします。
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Google Chrome をインストールします。
sudo apt install -y ./google-chrome-stable_current_amd64.deb
インストールされている Google Chrome のバージョンを確認します。
google-chrome --version
マシン上で Selenium ボットのみを実行している場合、これらの手順は必須ではありません。ただし、他のプロジェクトに取り組んでいる場合や、隔離された環境が必要な場合には、これをお勧めします。
仮想環境を作成しましょう。
python3 -m venv venv
仮想環境をアクティブ化します。
source venv/bin/activate
次に、Selenium と webdriver-manager をインストールします。
pip install selenium pip install webdriver-manager
webdriver-manger の目的は、さまざまなブラウザーのバイナリ ドライバーの管理を簡素化することです。詳細については、ドキュメントを参照してください。
## main.py from selenium import webdriver ## ---- Use for type hint ---- ## from selenium.webdriver.chrome.webdriver import WebDriver ## --------------------------- ## from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager def create_chrome_web_driver_connection(headless: bool, detach:bool, use_sandbox: bool, use_dev_shm: bool, window_width: int = 1052, window_height: int = 825 ) -> WebDriver: service = Service(ChromeDriverManager().install()) options = Options() options.add_experimental_option("detach", detach) options.add_argument(f"--window-size={window_width},{window_height}") options.add_argument("--disable-extensions") options.add_argument("--disable-renderer-backgrounding") options.page_load_strategy = 'normal' if not use_sandbox: options.add_argument('--no-sandbox') if not use_dev_shm: options.add_argument('--disable-dev-shm-usage') if headless: options.add_argument("--headless=new") driver = webdriver.Chrome(service= service, options=options) return driver if "__main__" == __name__: driver = create_chrome_web_driver_connection(headless= True, detach= False, use_sandbox= False, use_dev_shm= False) driver.get('https://python.org') print(driver.title) driver.close()
options.add_experimental_option("detach", detach) :
options.add_argument(f"--window-size={window_width},{window_height}") :
必要に応じて、この行を削除できます。
Selenium をヘッドレス モードで実行する予定がある場合は、必ずこの方法でウィンドウ サイズを設定してください。そうしないと、私の経験では、デフォルトのウィンドウ サイズが小さすぎる可能性があります。このコマンド driver.get_window_size() でウィンドウ サイズを確認できます
options.add_argument("--disable-extensions") :
options.add_argument("--disable-renderer-backgrounding") :
options.page_load_strategy = '通常' :
options.add_argument('--no-sandbox') :
options.add_argument('--disable-dev-shm-usage') :
options.add_argument("--headless=new") :
Selenium プログラムで環境変数を使用する必要がある場合、これを実現するには 2 つの方法があります。
python-dotenv などのライブラリで .env ファイルを使用する (より一般的で人気のある方法)。
systemd の組み込みオプションを使用して環境ファイルをセットアップします。
この例では、2 番目のオプションを使用します。
まず、/etc ディレクトリ内に conf.d ディレクトリを作成しましょう。
sudo apt update
次に、プレーンテキストファイルを作成します(これが環境ファイルになります)。
sudo apt update
これで、作成したファイルに環境変数を追加できます。
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
環境変数を使用するように Python スクリプトを変更します。
sudo apt install -y ./google-chrome-stable_current_amd64.deb
この /etc/systemd/system/ ディレクトリ内にサービス ファイルを作成する必要があります。ここは、システム管理者によってインストールされた systemd ユニットが配置される場所です。
google-chrome --version
この例では、あなたが VPS にいて、root ユーザーとしてサービスを実行すると仮定します。
[!警告]
サービスは root (管理者) 権限で実行されます。これにより、システムへの完全なアクセスが許可されますが、通常、セキュリティ上の理由で必要な場合を除き、root として実行することは避けられます。
これをサービス ファイルに追加します。
python3 -m venv venv
このセクションでは、サービスのメタデータと依存関係を定義します。
Description=Selenium Bot Service : サービスの機能の簡単な説明を提供します。この場合、「Selenium Bot Service」として説明されています。この説明は、サービスを識別するためにシステム ログと systemctl によって使用されます。
After=network.target: これにより、ネットワークが利用可能になった後にのみサービスが開始されます。 network.target は、基本的なネットワーク機能が稼働していることを示す systemd ターゲットです。
このセクションでは、サービスの実行方法、どのユーザーが実行するか、失敗した場合の対処方法など、サービス自体の構成を指定します。
User : サービスを実行するユーザーを指定します。ここではrootに設定しています。
EnvironmentFile : サービスで使用される環境変数を含むファイルを指定します。
WorkingDirectory: サービスを実行するディレクトリを指定します。これはサービス プロセスの作業ディレクトリです。ここでは、ボット ファイルは /root/selenium_bot/
に保存されていますExecStart : サービスを開始するコマンドを定義します。ここでは、/root/selenium_bot/
にある main.py ファイルを実行します。Restart=on-failure : サービスが失敗して終了した場合 (つまり、ゼロ以外の終了ステータス)、自動的に再起動するようにサービスを構成します。これは、時折障害が発生する場合でも、ボット サービスが確実に実行され続けるようにするのに役立ちます。
RestartSec=5s : 失敗した場合の再起動間の遅延を指定します。この場合、サービスは失敗後に再起動を試みるまで 5 秒待機します。
StandardOutput=journal : サービスの標準出力 (stdout) を systemd ジャーナルにリダイレクトします。これは、journalctl を使用して表示できます。これは、ログ記録とデバッグの目的に役立ちます。
StandardError=journal : 標準エラー (stderr) 出力を systemd ジャーナルにリダイレクトします。サービスで発生したエラーはすべてログに記録され、journalctl
を使用して表示することもできます。このセクションでは、サービスをいつどのように有効化または開始するかを定義します。
WantedBy=multi-user.target : サービスを有効にするターゲットを指定します。この場合、multi-user.target は、システムが非グラフィカル マルチユーザー モード (サーバーで一般的) のときに到達する systemd ターゲットです。これは、システムがこのターゲットに到達したとき、通常はシステムがマルチユーザー環境で起動したとき、サービスが開始されることを意味します。
systemd サービスで可能なすべての設定の詳細については、リファレンスを確認してください
サービス ファイルが有効であることを確認してみましょう。すべてが正常であれば、何も表示されないはずです。
sudo apt update
systemd 構成をリロードして、新しいユニットまたは変更されたユニット (サービス) を探します。
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
サービスを開始/再起動します。
sudo apt install -y ./google-chrome-stable_current_amd64.deb
サービスを停止してください。
google-chrome --version
サービスのステータスを確認してください。
python3 -m venv venv
起動時にサービスを自動的に開始する場合は、これを実行します。
source venv/bin/activate
Python では、対話型環境でスクリプトを実行するとき (たとえば、ターミナルで python3 filename.py を手動で実行するとき)、Python は行バッファリングを使用します。これは、print() ステートメントからの出力と同様に、出力がすぐに表示されることを意味します。
ただし、Python プログラムが非対話型環境で実行される場合 (これは今回のケースです)、出力ではブロック バッファリングが使用されます。これは、バッファがいっぱいになるかプログラムが終了するまで、プログラムは出力をバッファに保持し、ログや出力が表示されるまで遅れることを意味します。
Python の出力バッファリングの仕組みについて詳しくは、こちらをご覧ください。
ログと出力をリアルタイムで表示したいため、この問題には 2 つの方法で対処できます。
Python3 ドキュメントにはこれが記載されています。
-u stdout ストリームと stderr ストリームのバッファリングを強制的に解除します。 このオプションは標準入力ストリームには影響しません
-u フラグを使用すると、Python は stdout と stderr の両方に対して完全なバッファなしモードで動作します。これは、各バイトが生成されるとすぐに端末 (またはログ ファイルなどの出力ストリーム) に直接送信されることを意味します。バッファリングはまったく行われません。
通常 stdout に出力されるすべての文字 (print() ステートメントやエラーなど) は、行全体やバッファーが蓄積されるのを待たずに、バイト単位で即座に書き込まれます。
このオプションを使用するには、次のようにスクリプトを実行します:
sudo apt update
このオプションを使用する場合は、サービス ファイル内の ExecStart を必ず変更してください。
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Python では、print() 関数はデフォルトで出力をバッファリングします。つまり、出力はメモリに保存され、バッファがいっぱいになるかプログラムが終了した場合にのみ出力されます。 flash=True を使用すると、print() 呼び出しの直後に Python に出力を強制的にフラッシュさせ、出力がすぐに表示されるようにすることができます。
sudo apt install -y ./google-chrome-stable_current_amd64.deb
systemd ユニット (サービス) の完全なログ履歴を表示するには、次のコマンドを使用します。
google-chrome --version
リアルタイムでログを監視するには、-f フラグを使用します。これにより、最新の日記エントリのみが表示され、日記に追加される新しいエントリが継続的に出力されます。
python3 -m venv venv
以上がsystemd を使用して Selenium を Linux デーモンとして設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。