少し身の上話となるが、2024年4月に自動車学校に入校した。
入校説明時に「教習予約をスムーズに行うには22,000円の課金が必要」ということが判明した。課金しない場合、専用の予約サイトでキャンセル待ちをし、都度予約することが必要とのこと。都内1人暮らし(26歳男性)には「22,000円の課金」はかなり大きい。その場では課金することなく、キャンセル待ちをするという形で入校した。
だが、常に専用の予約サイトに張り付いているわけにはいかない。そこで「自動化すれば良いじゃないか」という発想に至り、ブラウザの自動操作ができるSeleniumに触れることになった。
導入が少し長くなったが、いくつかの章に分けてSeleniumについて解説する。Seleniumに触れたことがなかった(Pythonは少しわかる)自分でも、入校した当日中に思い通りのシステムを構築できたため、初学者の方も参考にしてほしい。
【簡単に解説】Seleniumとは何か?
Seleniumは、ブラウザを自動操作するためのフレームワーク。
主にWebアプリケーションのテスト自動化に利用されるが、スクレイピングや自動データ入力など、さまざまなシナリオで活用することができる。
Seleniumの基本機能
- 自動ブラウジング:プログラムを通じてブラウザを操作し、ウェブサイトにアクセス可能
- 要素の操作:テキスト入力、ボタンクリック、リンク操作など、ユーザーのアクションをコードで操作可能。
環境
Amazon Linux2023
※Lambdaレイヤを作成してみたが、うまくいかなかった。。
Seleniumの設定
Seleniumを使用するためには、Selenium WebDriverとブラウザドライバ(この例ではChromeDriver)が必要。以下の手順に従ってインストール。
- Pythonとpipのインストール
$ sudo yum install python3-pip
- Seleniumライブラリのインストール
$ pip3 install selenium
- ChromeDriverのインストール
$ pip3 install chromedriver-binary
Seleniumの基本的な使用例
次のPythonスクリプトは、Googleのホームページを開き、そのタイトルを出力する基本的な例。
Seleniumスクリプトの実行
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import chromedriver_binary # chromedriver_binaryをパスに追加
def main():
# Chromeオプションの設定
options = Options()
options.add_argument("--no-sandbox") # サンドボックスモードの無効化
options.add_argument("--headless") # GUIがない環境での実行
options.add_argument("--disable-dev-shm-usage") # /dev/shmパーティションの使用を避ける
options.add_argument("--disable-gpu") # GPUハードウェアアクセラレーションを無効化
options.add_argument("start-maximized") # 最大ウィンドウサイズで開始
options.add_argument("disable-infobars") # Chromeの情報バーを非表示に
options.add_argument("--disable-extensions") # 全ての拡張機能を無効化
# Chrome WebDriverサービスを設定
service = Service(executable_path=chromedriver_binary.chromedriver_filename)
# ChromeのWebDriverオブジェクトを作成
driver = webdriver.Chrome(service=service, options=options)
try:
# Googleのホームページにアクセス
driver.get("https://www.google.com")
# ページのタイトルを出力
print("Title: " + driver.title)
finally:
# ブラウザを閉じる
driver.quit()
if __name__ == "__main__":
main()
以下でも実行できるかも
from selenium import webdriver
import chromedriver_binary # Adds chromedriver binary to path
driver = webdriver.Chrome() # ChromeのWebDriverオブジェクトを作成
driver.get('https://www.google.com') # Googleのホームページにアクセス
print("Title: " + driver.title) # ページのタイトルを出力
driver.quit() # ブラウザを閉じる
実行結果
上記のprintで出力したtitleが出力される
$ python3 test.py
Title: Google
実行時の問題と解決策
Seleniumを使用する際には、特定の問題が発生することがある。たとえば、ChromeDriverのバージョンがブラウザのバージョンと一致しないとエラーが生じる。これを解決するために、適切なバージョンのChromeDriverをインストールする必要がある。
$ pip3 uninstall chromedriver-binary
$ pip3 install chromedriver-binary==123.0.6312.122
さらに、Linux環境ではChrome自体がインストールされていないことが原因でエラーが発生することがある。以下のコマンドでChromeをインストールする。
$ sudo yum install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
コードの紹介
サイトの表示
次のとおりgetメソッドを使用することでサイトを開くことができる。
driver.get("https://www.google.co.jp")
その他のコードについては次回以降で説明する。
まとめ
Seleniumは、Webブラウザの自動操作を可能にするツール。使いようによってはとても便利になる。実際自分は自動車学校の予約サイトへのアクセス~予約可能通知までを自動化でき、2万円以上の節約につながった。
また業務でPythonを書くことはあったが、本当に自分が実装したいものがあると調査意欲、実装スピードが上がるのだと感じた。やはり自分が実装したいと思うシステムを作成すると夢中になれるしより成長できると実感した。