Python Selenium Web 自動操作

Python Selenium Web 自動操作概要

Python Selenium による Web ペ-ジの自動操作を行ないたいと思います。
自動操作とはブラウザを操作するように実際に Web ペ-ジに対する操作を指示してクロ-リングします。
具体的に言うとフォ-ムへの入力などを行なうこと等が主題となります。
ここでは入力が必要な Web サイトの例としてまずはGoogle 検索を自動で行ないます。
Selenium はブラウザを自動操作するためのライブラリ-です。
JavaScript などの言語にも対応しています。
ここがすばらしいところです。
プラウザ-ベンダ-が WebDriver API を実装するドライバ-を用意しており、これを経由して操作します。
今回は Chrome を自動操作します。
Firefox や Edge ドライバ-を経由してプラウザを操作する事も可能なようです。

Selenium と ChromeDriver, chromium-browser のインスト-ル

Selenium と ChromeDriver, chromium-browser をインスト-ルします。
Ubuntu ディスクトップ画面から端末画面を開きます。
yamada@ubuntu-20:~$
sudo apt install python3-selenium
この方法が最も簡単なインスト-ル方法です。
ChromeDriver, chromium-browser も合わせてインストールされます。
時間は10分ぐらいかかります。
ChromeDriver のインスト-ル場所は
$ which chromedriver
結果
/usr/bin/chromedriver
バ-ジョンは
$ chromedriver --version
結果
ChromeDriver 87.0.4280.88
(89e2380・・・・290d-refs/
branch-heads/4280@{#1761})
のように確認できます。
chromium-browser のインスト-ル場所は
$ which chromium-browser
結果
/usr/bin/chromium-browser
で確認する事ができます。
また Selenium パッケージのインスト-ル場所は
$ pip3 show selenium
結果
/usr/local/lib/python3.8/dist-packages
で確認できます。

Selenium を使った自動操作

Selenium ではフォ-ムの要素に対して send_key()メソッドでキ-ボ-ド入力を送ることができます。
これにより通常のブラウザで Enter キ-を押したときと同じようにフォ-ムを送信することができます。
また driver.save_screenshot() メソッドでスクリ-ンショットを取得し、 引数に指定したパスに保存できます。
まずは、Google 検索を自動で行ないます。
概略の流れは次のようになります。
1. 必要なパッケ-ジ類を import
2. Chrome の WebDriver オブジェクト作成
3. Google のドップ画面を開く
4. 検索語を入力して送信
5. スクリ-ンショット取得
6. 検索結果表示
7. ブラウザ終了

Selenium で Google 検索を行なう

それでは、Selenium で Google 検索を行なうコ-ドを作成していきます。
過去私が紹介してきたPython ファイルでは冒頭に、お決まりの作法で
#!/usr/bin/python3
# coding: utf-8
print("Content-type: text/html; charset=UTF-8\n\n")
を出力し Python から出力された文字は Web で見ることができるようにしてきたのですが、 どうもこれがうまく行きません。
chromium はブラウザなのでその表示内容をさらに Apache2 環境で見ることは所詮できないようです。
よって、上記3行のコ-ドは省略します。

ライブラリ取り込み

取り込む必要があるライブラリは3つです。
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.keys import Keys
import datetime

Keys は selenium.webdriver.common.keys のなかにあります。
datetime はスクリーンショットのファイル名を作成するときに使用します。

スクリーンショットファイル名準備

スクリーンショットのファイル名をあらかじめ作成します。
このファイル名を固定にしておくとスクリーンショット画像を保存するとき 上書きをしないでパスしてしまいます。
エラ-にはならないようです。
now = datetime.datetime.now()
now_str = now.strftime('%Y%m%d%H%M%S')
scsh_name = '/home/yamada/public_html/images/' + now_str + '.png'
print(scsh_name)
現在日時(日付と時刻)の datetime オブジェクトを取得するには datetime モジュールの datetime.now() を使います。
strftime() を使用すると、日付、時間から文字列への変換してくれます。
このとき、以下の書式化コードを使用します。
すべて、0 埋めした10進数で表記したものになります。
%d : 月中の日にち
%m : 月
%y : 西暦の下2桁
%Y : 西暦4桁
%H : 時(24時間表記)
%I : 時(12時間表記)
%M : 分
%S : 秒
なお、スクリーンショットのファイル保存場所は絶対パスで指定する必要があります。

Chrome の WebDriver オブジェクト作成

ChromeOptions のオブジェクトを作成します。
オブジェクト名は適宜決めてください。
optio = ChromeOptions()
とすると Chrome ブラウザのための各種設定オブジェクトが optio のなかに作成されます。
次に、Chrome の WebDriver オブジェクトを作成します。
このオブジェクトが人間に代わって Chrome ブラウザを操作してくれます。
driver = Chrome(options=optio)
これで Chrome ブラウザ操作準備完了です。
2022/1/10日追記
2021/10月、Virtual Ubuntu で動作していた Selenium Web 自動操作が急に動かなくなりました。
WebDriver オブジェクト作成がうまくできなくなりました。
Selenium3 が Selenium4 にアップデ-トされたことが原因だったようです。
対応策については
Selenium Web 自動操作動作停止 で解説しています。
ご覧ください。

Googleトップ画面

それでは Google のトップ画面を開きましょう。
driver.get('https://www.google.co.jp/')
このぺ-ジのソ-スの head 部分を見ると以下のようになっているので


  • google ソ-ス
  • タイトルに 'Google' が含まれていることを確認します。
    assert 'Google' in driver.title
    assert を使用すると通常は、
    期待される値 'Google' == 実際の値 'Google'
    となるので True が返り、何事もなく通過します。
    失敗の場合は False が返り
    例外 AssertionError
    が発生します。

    ここまでで、Selenium で Google 検索を開始する準備ができました。
    引き続き Google 検索を行なっていきます。


  • Selenium で Google 検索開始 に進む
  • 70VPS に戻る