Raspberry PiにデフォルトでインストールされているChroniumでSeleniumによるブラウザの操作を自動化を実現する方法について、苦労したので備忘録的にまとめておきます。
特にドライバーをインストールする方法は、ネット上にいろいろな方法があって正解にたどり着くまでに時間がかかりました。
サイトからインストールしてくるなど、方法がいろいろと調べていると出てきますが、結論コマンド一発でパッケージマネージャーからインストール可能でした。
Seleniumでできること
Seleniumはブラウザ操作の自動化行うことのできるフレームワークです。HTMLの形式で記述されている要素を操作するために使用されます。
オープンソースであるため無料で利用することができ、Webブラウザの介入するあらゆるタスクの自動化を行うことができます。
近年ではいわゆるSaaS(Software as a Service)と呼ばれるのサービス形態が広く普及し、Webを介して提供される会計/経理、技術開発、事務処理などあらゆるサービスが多くなっています。
このような動向からもWebブラウザの自動操作の技術を身に着けることは仕事の効率化などにも貢献するのではないでしょうか?
【活用方法】
- Webアプリケーション操作の自動化
- Webスクレイピング(情報抽出自動化)
今回はRaspberry Pi + Pythonを用いたSeleniumの使い方にフォーカスを当てて、環境構築から簡単な実装テストまで行ってみます。
Raspberry Piのような小型PCは、一般的なPCに比べて低消費電力であるため、定期的な情報収取などには適しているとも言えます。
ここで一点注意していただきたいことは、Seleniumなどでデータ収集を行う場合、Webスクレイピングは禁止しているサイトもあることです。このようなルールは、サイトごとの規約に従いSeleniumを利用しましょう。
Raspberry Pi環境の確認
使用するRaspberry Piの開発環境情報を確認しておきます。
OS情報の確認
Raspberry Pi OSの情報を確認します。
コマンド:
lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
Seleniumの動作環境を整える前に、いったんパッケージリストの更新と、インストール済みパッケージの更新を行っておきましょう。
事前アップデートコマンド:
sudo apt-get update
sudo apt-get upgrade
Pythonバージョンの確認
次にインストールされているPythonのバージョン情報を確認します。コマンド:
python3 -V
Python 3.9.2
今回は、Pythonのバージョン3.9.2で動作確認を行っています。
chromium環境の確認
Seleniumではブラウザを自動制御するためにchromedriverを用いるので、Raspberry Piに標準インストールされているであろうchromiumドライバーのバージョン情報を確認しておく必要があります。■ GUI上で確認する方法
- 右上「…」→「Chromiumについて」
- 右上「…」→「設定」→「Chromiumについて」
■ ターミナルで確認する方法
コマンド:
dpkg -l chromium*
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前 バージョン アーキテクチ 説明
+++-============================-==================-============-===================================================
un chromium <なし> <なし> (説明 (description) がありません)
ii chromium-browser 124.0.6367.73-rpt1 armhf Chromium web browser, open-source version of Chrome
un chromium-browser-inspector <なし> <なし> (説明 (description) がありません)
ii chromium-browser-l10n 124.0.6367.73-rpt1 all chromium-browser language packages
ii chromium-chromedriver 124.0.6367.73-rpt1 armhf WebDriver driver for the Chromium Browser
un chromium-codecs-ffmpeg <なし> <なし> (説明 (description) がありません)
ii chromium-codecs-ffmpeg-extra 124.0.6367.73-rpt1 armhf Extra ffmpeg codecs for the Chromium Browser
un chromium-driver <なし> <なし> (説明 (description) がありません)
一旦ここでは、バージョンの確認だけしておきましょう。
あとからインストールしたドライバに合わせてブラウザのアップデートを行います。
Pythonの仮想環境を構築する(任意)
この手順は必須ではないですが、Pythonを使う場合には使う方が多いと思うので手順だけ載せておきます。
今回はvenvを用いた仮想環境を使用して動作確認を行っています。
仮想環境の作成コマンド:
python -m venv {仮想環境名}
source ./venv/bin/activate
仮想環境を有効化した場合でも、Pythonのバージョンは3.9.2でした。
Selenium動作環境の構築
ここからが、Seleniumを動作させるためのChromium Driverのインストール手順になります。
Seleniumのインストール
まず、PythonでSeleniumを動作せせるためにライブラリをインストールします。コマンド:
pip install selenium
次の操作でインストールしたSeleniumのバージョンなどを確認することができます。
確認コマンド:
pip show selenium
Name: selenium
Version: 4.21.0
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: None
Author-email: None
License: Apache 2.0
Location: /home/user_name/path/venv/lib/python3.9/site-packages
Requires: typing-extensions, urllib3, trio-websocket, certifi, trio
Required-by:
ここで、pipでインストールしたパッケージを以下コマンドでファイルに出力してみました。
コマンド:
pip freeze > requirements.txt
attrs==23.2.0
certifi==2024.6.2
exceptiongroup==1.2.1
h11==0.14.0
idna==3.7
outcome==1.3.0.post0
PySocks==1.7.1
selenium==4.21.0
sniffio==1.3.1
sortedcontainers==2.4.0
trio==0.25.1
trio-websocket==0.11.1
typing-extensions==4.12.2
urllib3==2.2.1
wsproto==1.2.0
Chromiumドライバーをインストール
いよいよ本題のChromiumドライバーをインストールする手順です。コマンド:
sudo apt install chromium-chromedriver
ここで、ドライバーがローカルにインストールされていることを確認しておきます。
次のコマンドで、インストールパスの確認を行います。
コマンド:
which chromedriver
/usr/bin/chromedriver
インストールしたchromiumドライバーのパスをPythonコードに記載する必要があるので、上記コマンドでパスを調べておきます。
ブラウザとドライバのバージョンを一致させる
「chromium-chromedriver」と「chromium-browser」のバージョンが一致していることが、Seleniumでブラウザを操作する条件なので、それぞれのバージョンを一致させます。
具体的には、ブラウザとドライバ両方のバージョンを最新にすることで自動的にそろえてみます。
上の環境確認でも書いたように、以下でブラウザとドライバのバージョンを確認します。
コマンド:
dpkg -l chromium*
コマンド:
sudo apt-get dist-upgrade chromium-browser
それなりに時間がかかることがあります。
上記処理終了後、もう一度ドライバとブラウザのバージョン確認を行い、一致していたらSeleniumを動作させるまでの前準備は完了です。
Seleniumでブラウザ操作を試してみる
Seleniumのサンプルプログラムを置いておくので、実際に処理が動作するか確かめてみてください。
16行目の「chromedriver_path」は、上で確認したクロームドライバーのパスを記載してください。
サンプルプログラム(main.py)
# selenium 4
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ChromeDriverを立ち上げる
chromedriver_path = '/usr/bin/chromedriver' # インストールしたパスを記載
chromedriver_options = ChromeOptions()
# chromedriver_options.add_argument('--headless') # バックグラウンドで実行する場合有効化
driver = webdriver.Chrome(service=Service(chromedriver_path), options=chromedriver_options)
# -----------------------------------------------------
# - 操作する以外のすべてのブラウザウィンドウを閉じる
# -----------------------------------------------------
# 現在のウィンドウハンドルを取得
current_window = driver.current_window_handle
# すべてのウィンドウハンドルを取得
all_windows = driver.window_handles
# 現在のウィンドウ以外のすべてのウィンドウを閉じる
for window in all_windows:
if window != current_window:
driver.switch_to.window(window)
driver.close()
# 元のウィンドウに戻る
driver.switch_to.window(current_window)
# -----------------------------------------------------
# -本サイトのTopページへ遷移
# -----------------------------------------------------
url = "https://www.sukimalog.com"
driver.get(url)
# 最大60秒待機(要素が見つかり次第次の処理へ進む)
driver.implicitly_wait(60)
URLのパスを変えることで、どこのページでも開くことが可能です。
Seleniumを用いて開かれたブラウザの上部には、「Chromeは自動テストソフトウェアによって制御されています。」の文言が表示されていると思います。
Selenium4を用いたブラウザ基本操作方法
最後にSelenium4によるブラウザ操作記述について簡単にまとめておきます。
Selenium4とそれよりも前のバージョンとでは、記述の形が多少異なるので、お気を付けください。
要素の取得/特定記述
- By.NAME:
- driver.find_element(By.NAME, "hoge_name")
- By.ID:
- driver.find_element(By.ID, "hoge_id")
- By.CSS_SELECTOR:
- driver.find_element(By.CSS_SELECTOR, "img[title=hoge]")
- By.XPATH:
- driver.find_elements(By.XPATH, "//hoge")
使用優先度としては「ID>NAME>CSS_SELECTOR>XPATH」といった感じです。IDも無く、NAMEやCSSで絞り込めないときにXPATHで要素を指定することが多いです。
Seleniumによる基本操作
- クリック:
- driver.find_element(By.ID, "hoge").click()
- 値の入力:
- driver.find_element(By.ID, "hoge").send_keys("hoge_value")
- EnterKeyの押下:
- driver.find_element(By.ID, "hoge").send_keys(Keys.ENTER)
- 値の取得:
- element = driver.find_element(By.ID, "hoge")
Seleniumの使用例
// 使用例抜粋
element = driver.find_element(By.XPATH, "//tr[@id='posElem_411']//th[p='売買単位']/following-sibling::td/p/span[@class='fm01']")
driver.find_element(By.NAME, "input_quantity").send_keys(unit)
driver.find_element(By.CSS_SELECTOR, "img[title=取引]").click()
driver.find_element(By.ID, "shouryaku").click()
以上、ありがとうございました。
参考:
- https://irohaplat.com/raspberry-pi-selenium-installation/
- https://scr.marketing-wizard.biz/dev/chromedriver-version