こんにちは、ナナオです。

最近、いろんな図書館からいろんな本を借りることが多いのですが、書籍の予約管理を今はメモで行っており、ちょっとこれだと見づらいので一元管理できるシステムを作ることにしました。

ということで、早速実装していきましょう。

(Seleniumの詳細な説明は省略します、詳細はこちらから!)

仕様

とりあえず必要な仕様は以下の通りです。最初はシンプルにいきましょう。

  • WebUIを出力
  • 書籍の予約を一覧で表示する
    • 「名前」と「借りている図書館」を表示する

とりあえずこれでいきましょう。

実装にはSeleniumと相性がよく、私がすぐ実装できるpythonを使用します。

実装

とりあえずローカルでseleniumを動作させられる環境を構築します。

まずは土台になるパッケージを作成します。

uvを使います。

uv init --package --project library-checker
uv add selenium

seleniumの動作環境構築はDockerでやるのが一番楽なので、以下のコマンドを実行します。

docker run -d -p 4444:4444 --rm --shm-size="2g" selenium/standalone-chrome:4.39.0-20251212

(実行イメージはこちらを参考にしました)

これでとりあえず動作させる準備が整いました。

seleniumを動作させる基本実装は以下の通りです。

from selenium import webdriver

def main():
    # Chrome のオプションを設定する
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')

    # Selenium Server に接続する
    driver = webdriver.Remote(
        command_executor='http://localhost:4444/wd/hub',
        options=options,
    )

    # ブラウザを終了する
    driver.quit()

if __name__ == "__main__":
    main()

これで特にエラーなく動作すれば最初のステップは問題ないです。

次にログイン関数を実装します。

この辺は具体的には記載できませんが、大体こんな感じで実装すればいけます。

def login(driver: webdriver.Remote, userid: str, password: str) -> None:
    driver.get('ログイン画面のURL')

    userid_input = driver.find_element(By.ID, 'userid')
    password_input = driver.find_element(By.ID, 'password')
    login_button = driver.find_element(By.ID, 'login')

    userid_input.send_keys(userid)
    password_input.send_keys(password)
    login_button.click()
    
    driver.implicitly_wait(10)  # ログイン処理が完了するまで待機

また、予約一覧取得関数も同様に実装します。

from dataclasses import dataclass
from typing import List

# 予約一覧から返却する予約アイテムクラス
@dataclass
class ReserveItem:
    library_name: str
    book_title: str

def get_reserve_list(driver: webdriver.Remote, username: str) -> List[ReserveItem]:
    driver.get('予約一覧のURL')

    # 予約一覧の情報を取得する
    reserve_items = []
    for item in driver.find_elements(By.CSS_SELECTOR, '#result > table > tr'):
        book_title = item.find_element(By.CSS_SELECTOR, '.trtitle').text
        reserve_items.append(
            ReserveItem(
                borrower_name=username,
                library_name="図書館の名前",
                book_title=book_title,
            )
        )
    
    return reserve_items

これをmain関数に組み込みます。

useridなどの秘匿情報は.envファイルにしておきたいので、dotenvをインストールしておきましょう。

uv add dotenv

ではメイン関数を少し修正します。

from selenium import webdriver
from selenium.webdriver.common.by import By
from dotenv import load_dotenv

import os
from dataclasses import dataclass
from typing import List

load_dotenv()

# ...中略...

def main():
    # Chrome のオプションを設定する
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')

    # Selenium Server に接続する
    driver = webdriver.Remote(
        command_executor='http://localhost:4444/wd/hub',
        options=options,
    )

    # Selenium 経由でブラウザを操作する
    userid = os.environ.get('USERID')
    username = os.environ.get('USERNAME')
    password = os.environ.get('PASSWORD')

    login(driver, userid, password)
    reserve_list = get_reserve_list(driver, username)

    for item in reserve_list:
        print(f'Borrower: {item.borrower_name}, Library: {item.library_name}, Book Title: {item.book_title}')

    # ブラウザを終了する
    driver.quit()

こんな感じで、情報を取得したい図書館の数だけログイン関数と予約取得関数を用意します。

…とまぁここまで書いてあれですが、実装をあまり書けないのでこの辺にしておきます。

感想

selenium、面白いですね。

ここで取得した情報をもとにサイト構築を行いたいと思います。

ということでまた次回。

参考

Seleniumでブラウザ操作する方法まとめ #Python - Qiita