このページでは、Selenium
について紹介を行なっていきます。
基本的には、このページでは Selenium
がどんなものであるのか?という観点での説明を行なっていきます。特に、Python の Reqeusts
というライブラリと比較しながら説明を行なっていきます。Selenium
も Reqeusts
も同じ目的で利用することがありますが、両者には決定的な違いがあります。その違いを考えながら、Selenium
の特徴を説明していきたいと思います。
Selenium
の「使い方」については下記ページで解説していますので、使い方を知りたいという方は下記ページを参照していただければと思います。
また、このページでは「Selenium
とは何なのか?」という観点に対して一般的な説明を行なっていくため、ところどころ Python 特有の話はあるものの、他のプログラミング言語を利用している方にも理解していただける内容になっています。ですので、他のプログラミング言語利用者の方も、是非この後の解説を読み進めていただければと思います!
Contents
Selenium
とは
では、早速 Selenium
について説明していきます。
Selenium
とは、ウェブブラウザ操作の自動化フレームワークの1つとなります。
まずは下のアニメを見てみてください。これは、私が手動で行なったウェブブラウザ操作ではなく、Selenium
を利用した Python によって実行されたウェブブラウザ操作になります。Selenium
を利用した場合、こんな感じでウェブブラウザ操作を自動化することができます。
そして、ウェブブラウザ操作を自動化することで、ウェブスクレイピングやウェブアプリの動作確認等を自動化することも可能となります。
Python には、こういった「操作を自動化するライブラリ」の1つに PyAutoGUI
が存在します。下記ページでも詳細を解説していますが、PyAutoGUI
ではクリック操作やマウス操作を自動化することができ、それによりパソコン上での操作全般を自動化することができます。
Selenium
に比べて汎用性は PyAutoGUI
の方が高いですが、ウェブブラウザ操作に特化している分、Selenium
の方がウェブブラウザ操作の自動化には向いており、簡単かつ楽に自動化することができます。また、HTML の取得などもできるため、Selenium
はウェブブラウザ操作だけでなくウェブスクレイピングに利用することも可能です。
Selenium
の公式ページにも下記のように記載されており、何を自動化するかはあなた次第になります。ただ、Selenium
でどんなことができるかを知らないと自動化のアイデアも出てこないと思いますので、このページで Selenium
がどんなものであるか?そして、どんなことが出来るのか?について理解していっていただければと思います。
Selenium はブラウザを自動化します。それでおしまい!
その力を使って何をするかは完全にあなた次第です。主に、テスト目的で Web アプリケーションを自動化するためのものですが、それだけに限定されるわけではありません。
退屈な Web ベースの管理タスクも自動化できます (またそうすべきです)。
引用元:Selenium 公式
Selenium
の特徴
前述の通り、Selenium
はウェブブラウザ操作の自動化フレームワークになります。Selenium
を利用することでウェブブラウザに対して様々な操作を行うことが可能となり、それによってウェブスクレイピングやウェブアプリの動作確認を行うことができます。
ただし、ウェブスクレイピングやウェブアプリの動作確認を実現可能なライブラリやフレームワークは Selenium
以外にもたくさん存在します。例えば Python であれば、これらを行うために Requests
や http.client
などが利用されることもあります。
ですが、これらのライブラリと Selenium
とでは、ウェブスクレイピングやウェブアプリの動作確認を実現する方法が全く異なります。
ここからは、比較対象として Requests
を取り上げ、Requests
と比較しながら Selenium
の特徴を説明していきたいと思います。
スポンサーリンク
“ウェブブラウザの操作” の実行が可能
前述でも述べたとおり、Selenium
では “ウェブブラウザの操作” を実行することが可能です。この点が Selenium
の最大の長所・特徴となります。そして、これにより、ウェブアプリの動作確認などを人間が手作業で行うのではなく、Python に実行させることが可能となります。
また、前述の通り、ウェブスクレイピングやウェブアプリの動作確認には Requests
ライブラリが使用されることもあります。ですが、Requests
と Selenium
とでは、これらの実現手段が全く異なります。
Selenium
ではウェブブラウザの操作を実行することによって、ウェブスクレイピングやウェブアプリの自動テストを実現するのに対し、上記で挙げたようなライブラリではデータの通信を実行することによって、これらを実現することになります。
そして、この2つの違いが、他のライブラリに比べた Selenium
の詳細な特徴となります。
ウェブブラウザの操作とデータ通信の違い
ということで、次は「ウェブブラウザの操作」と「データの通信」の2つの違いや関連性について解説していきたいと思います。この2つを理解しておくことで、Selenium
と他のライブラリの使い分けを正しく行うことができるようになります。
まず、多くのウェブアプリやウェブサイトでは、ウェブブラウザから「ボタンをクリック」してデータの登録を行なったり「リンクをクリック」して他のページに移動したりすることが可能です。これらが実現できるのでは、これらの操作が行われた際にウェブブラウザからサーバーに対してデータの通信が行われるからになります。
例えば、フォームの各種フィールドにデータを入力して送信ボタンを押した場合、各種フィールドに入力されたデータがサーバーに送信されることになります。そして、そのフォームの種類に応じた処理がサーバー側で実行されることになります。
分かりやすいのが「ユーザー登録フォーム」です。ユーザー登録フォームで送信ボタンを押せば、各種フィールドに入力されたデータがサーバーに送信され、そのデータがデータベース等に保存されることで、ユーザー登録が実現されることになります。
つまり、ウェブブラウザでの操作の多くは、データの通信を行うことを目的に実施されるものが多いです。で、この場合、ユーザーの目的を達成するために必要なのは、ウェブブラウザで操作を行うことではなくデータの通信を行うこととなります。
極端な例で言えば、前述のユーザー登録フォームにおいて、送信ボタンを押してもデータの通信が行われなければサーバーはデータを受け取ることができず、ユーザー登録も行えないことになります。
逆に、送信ボタンを押さなくても、必要なデータさえウェブサーバーに送信できれば、ウェブサーバーは受け取ったデータに応じたユーザー登録を行ってくれることになります。
そして、このデータの通信は前述で紹介した Requests
等の多くのライブラリで実現することができます。やろうと思えばソケット通信さえできれば、上記のようなデータの通信は実現できます。
つまり、ウェブブラウザを操作しなくても、データの通信さえ行えば、上記で例として挙げたユーザー登録も実現できるということになります。
ここではウェブアプリのボタンを押した際の動作について説明しましたが、単にウェブページを表示する場合でも同様で、ウェブブラウザの操作でウェブページを表示する際には、リンクをクリックしたり、URL バーに URL を指定する操作を行うことになります。
この場合も結局は、URL に対応するページを表示したいというリクエストをウェブサーバーに送信していることになります。そして、そのレスポンスとして HTML を受け取り、それをウェブブラウザがページとして描画することで、ユーザーは要求したページを表示することができることになります。
ただ、基本的にはリクエストをウェブサーバーに正しく送信さえすればウェブサーバーがレスポンスとして HTML を送信してきてくれるはずなので、これもウェブブラウザの操作ではなく、データの通信処理によっても実現可能です。
そして、この送信されてくる HTML を解析することがウェブスクレイピングとなります。つまり、データの通信によって、ウェブスクレイピングを実現することが可能です。
このように、ウェブブラウザでの操作で実現できることの多くは、データの通信をサーバーと直接行うことでも実現することができます。
要は、Python スクリプトからウェブブラウザの操作を介してデータの通信を行うか、Python スクリプトから直接サーバーとデータの通信を行うかの違いしかありません。そして、前者を行うのが Selenium
であり、後者を行うのが、例えば Requests
であったりします。
ここまでの説明を聞くと「じゃあ Selenium
をわざわざ使う必要ないじゃん」と感じる人も多いかもしれません。これはまさにその通りで、Requests
でも頑張ればウェブブラウザ操作時と同様の結果を取得し、それを使ってウェブスクレイピングをしたり、ウェブアプリの動作確認等も行うことができます。
ただ、Selenium
を使う方がこれらを実現するのが楽&簡単です。その理由は下記の3つになると思います。次は、これらの理由について解説していきたいと思います。
- 高度な知識や技術が不要
- ウェブブラウザの機能が利用可能
- 直感的な実装が可能
高度な知識や技術が不要
Selenium
を利用することで得られるメリットの1つは、高度な知識や技術なしにウェブスクレイピングやウェブアプリの動作確認を実現できる点にあります。
送信するデータに関する知識は不要
例えば、先ほど説明した「送信ボタン」の例で考えれば、ウェブブラウザは送信ボタンがクリックされた際にサーバーに対してデータの送信を行なってくれます。
この際には、送信するデータはウェブブラウザが自動的に生成し、そのデータをサーバーに送信してくれます。したがって、ユーザーはサーバーに送信するデータの中身をほとんど意識する必要はありません。”ほとんど” と限定詞をつけたのは、送信ボタンをクリックする際に、送信したい情報はユーザーが予めフィールドに入力しておく必要があるからになります。
ですが、それさえ行えば、送信されるデータの中身をユーザーは意識する必要がありません。送信が必要な情報をウェブブラウザが集め、その情報から適切な形式のデータをウェブブラウザが作成してくれます。
もちろん、Selenium
を利用する場合も、ウェブブラウザを操作して操作ボタンを押すことになるため、サーバーに送信するデータの中身を意識する必要はありません。したがって、Selenium
を利用すれば、サーバーに送信するデータの形式や必要な情報の知識は不要となります。
それに対し、ウェブブラウザを利用せずに Requests
等のライブラリでデータの送信を行う場合、その送信するデータはプログラマーが明示的に生成する必要があります。したがって、この場合、サーバーに送信するデータの形式や必要な情報の知識が必要となります。
単純に、送信ボタンが押された際に各種フィールドに入力された情報を送信するだけであればそれほど難しくはありませんが、ウェブアプリやウェブサイトの多くでは認証機能を搭載していたりセキュリティ対策が施されたりしていますので、これらを潜り抜けるための情報も一緒に送信する必要があります。そのため、認証やセキュリティ対策に関する知識や技術が必要となります。
例えば、Django で開発したウェブアプリでは自然と CSRF 対策が行われるようになり、フォームからデータを送信する際には CSRF トークンと呼ばれるデータも一緒に送信する必要があります。こういった知識も必要となりますし、こういった知識を持った上で Python スクリプトを実装する必要が出てきます。
ですが、Selenium
を利用する場合、こういった知識は不要です。Selenium
から各種フィールドに対して情報を入力して送信ボタンをクリックさえしてやれば、あとは必要な情報をウェブブラウザが自動的に収集し、収集した情報から適切な形式のデータを生成してサーバーに送信してくれます。
このように、データを送信するだけでも、Selenium
を利用するかしないかではプログラマーに必要な知識や労力に大きな差が出ることになります。
ウェブブラウザの機能が利用可能
Selenium
を利用するメリットの2つ目はウェブブラウザの機能が利用可能である点になります。
先ほど挙げたデータの送信も同様で、Selenium
を利用することでウェブブラウザの持つデータ送信機能が利用できるようになるため、データの送信に関する知識や技術がプログラマーに不要になります。
データの送信だけでなく、他にもウェブブラウザには様々な機能が存在し、それを利用することでウェブスクレイピングやウェブアプリの動作確認で実現可能なことが増えます。
ページの描画が可能
ウェブブラウザの重要な機能の1つとしてページの描画が挙げられます。
ウェブブラウザはユーザーからページ表示の操作(リンクのクリックなど)を受けた場合、ページ表示のリクエストをサーバーに送信し、サーバーから返却される HTML や CSS・JavaScript に基づいてページの描画を行います。そして、ユーザーは描画された結果を閲覧し、表示されている内容を認識することが可能です。
Selenium
を利用する場合、基本的にはウェブブラウザに描画されたページへの操作を行うことになるため、当然ウェブブラウザによって描画されたページを確認することができます。したがって、ウェブアプリの動作確認時に描画後のページの妥当性の確認等も行うことができますし、ウェブアプリの修正前後のページの違いをスクリーンショット等を利用して比較するようなことも行うことができます。
また、ページとして描画することでページ内にボタン等の操作可能な要素も表示されることになるため、Selenium
を利用した場合、こういった要素への操作を行うこともでき、これによって、ボタン等の要素を押した時の動作の確認等も行うことができます。
Requests
等のライブラリでも、ページ表示のリクエストをサーバーに送信し、サーバーから返却される HTML や CSS・JavaScript を受信することは可能です。ですが、ページの描画の機能を持っていないため、描画後のページの確認を行いたい場合は、別途ページの描画を行うような実装を行う必要があります。ただ、それにはかなりの労力が必要となるため、ページの描画結果を確認したいのであれば、Selenium
を利用する方が楽だと思います。
JavaScript 実行後にウェブスクレイピングが可能
また、ウェブブラウザの重要な機能の1つに JavaScript の実行も挙げられます。ウェブブラウザは、HTML から読み込まれる JavaScript を受信し、その JavaScript を自動的に実行してくれるようになっています。
例えば、ウェブスクレイピングを行う場合にはサーバーから受信した HTML を解析することになります。前述の通り、HTML の受信は Requests
からも行うことが可能です。ですが、Requests
が行ってくれるのは HTML や JavaScript の受信のみで、JavaScript を実行するような機能は持っていません。
この点が、ウェブスクレイピングを行う上で不便である場合があります。
JavaScript では、HTML に対してデータを埋め込むようなことが可能です。そのため、受信した HTML は、JavaScript の実行によって変更されるようなこともあります。そして、ウェブブラウザに表示されるページは JavaScript 実行後のものとなります。
ですので、表示されるページに対応した HTML に対して解析を行いたいような場合、JavaScript 実行後の HTML に対して解析を行う必要があることになります。
Requests
で HTML の受信は可能ですし、HTML から読み込まれる JavaScript を受信できるように実装すれば JavaScript を受信することも可能です。ですが、JavaScript の実行は Requests
からは行うことはできません。そのため、HTML に対して解析を行なったとしても、ページに表示されている内容とは異なる結果が得られる可能性があります。
簡単な例で考えてみましょう!例えば、下記のような HTML について考えてみましょう!ポイントは、最初の h1
の本文部分が空である点になります。
<h1 id="page-header"></h1>
<script>
document.getElementById("page-header").innerHTML = "Hello World!";
</script>
この HTML をウェブブラウザに読み込ませれば、下図のようなページが表示されることになります。画面右側には Chrome の検証機能を利用して表示した HTML を示しています。
ポイントは、先ほど本文部分が空であった h1
タグに Hello World!
という文字列が埋め込まれている点になります。この埋め込みを行なっている処理が <script>
〜 </script>
の部分に記述されており、この処理をウェブブラウザが実行することで h1
タグに Hello World!
が埋め込まれ、その結果がページとして表示される事になります。
ですが、単に受信した HTML のみを解析すると、<script>
〜 </script>
の部分が実行されていないため、h1
タグの本文部分の取得時に「空の文字列」が取得されることになってしまいます。つまり、JavaScript の実行の有無によって、HTML の解析結果が変わってしまう事になります。ウェブブラウザに表示されているページに対応する HTML の解析を行いたいのであれば、JavaScript 実行後の HTML に対して解析を行う必要があります。
前述の通り、Requests
はデータを受信することはできますが、JavaScript を実行する機能は持ちません。そのため、JavaScript 実行後の HTML に対して解析を行いたい場合、別途 JavaScript を実行する手段を導入し、JavaScript 実行後の HTML に対して解析を行うことができるよう工夫する必要があります。
それに対し、Selenium
の場合、操作対象のウェブブラウザが HTML から読み込まれる JavaScript を自動的に実行してくれるため、JavaScript 実行後の HTML を描画したページに対して操作を行うことが可能となります。
スポンサーリンク
直感的な実装が可能
また、Selenium
を利用するメリットとして直感的な実装が可能という点も挙げられると思います。
操作に対応するメソッドを実行すれば良いだけ
Selenium
はウェブブラウザの操作を行うフレームワークですので、Selenium
を利用する場合は Python スクリプトに「実行したいウェブブラウザの操作」に対応するメソッドの実行処理を記述していくことになります。
このメソッドは、我々が手動で行うウェブブラウザの操作に対応しているものが多いため、手動で行っていた操作に対応するメソッドの実行処理を実行したい順番で記述していくことになります。要は、いつも行っている操作を思い浮かべながら、それにしたがって直感的に実装していけば良いだけになります。
例えば、下の図のようなログインフォームでログイン操作を行うことを考えてみましょう!ユーザー名には YamadaHanako
、パスワードには yh123456
を入力するものとしたいと思います。
手動でログイン操作を行う場合は、下記の3つの操作を行うことになると思います。
- ユーザー名の入力フィールドに対して
YamadaHanako
を入力 - パスワードの入力フィールドに対して
yh123456
を入力 - ログインボタンのクリック
これらの操作を図で表すと下図のようになります。
これらを Selenium
を利用する Python スクリプトから実行する場合は、上記の3つの操作に対応するメソッドの実行を行うことになります。ちょっと抽象的な書き方になりますが、下記のような処理を順々に実行することで、上記に対応したログイン操作を実施することができます。send_key
がフィールドに対して文字列を入力するメソッドとなり、click
がボタン等をクリックするメソッドになります。
- ユーザー名の入力フィールドに対して
send_key('YamadaHanako')
を実行 - パスワードの入力フィードに対して
send_key('yh123456')
を実行 - ログインボタンに対して
click()
を実行
これらの処理の流れを図で表すと下図のようになります。ユーザーからの操作が Selenium
のメソッド実行に置き換わっていますが、操作の流れとメソッド実行の流れが同じであることが確認できると思います。
このように、Selenium
を利用する場合、いつも自分が行なっている操作を思い浮かべ、その操作に対応するメソッドの呼び出し処理を実装していけば良いことになります。そして、その実装に高度な知識や技術は不要ですので、他のライブラリを使用するよりも簡単にウェブスクレイピングやウェブアプリの動作確認等を実現することが可能となります。
要素の探索 / 取得が必要
ただし、これらの操作を行うためには、事前に操作対象となる要素を探索して取得しておくことが必要となります。Selenium
を利用する上では、この要素の探索が一番難しいと思います。逆に、この要素の探索さえ適切に行うことが出来れば、あとは前述のように直感的に実装を行なっていけば良いだけになります。
例えば、人間が手動でボタンをクリックする操作を実現する場合、目でボタンの位置を認識し、そのボタンの位置にマウスカーソル合わせるを合わせることで、クリック対象の要素を特定することになります。そして、マウスのボタンを押してクリックを行えば、ボタンのクリックを実現することになります。
このように、人間が手動で操作を行う際にも、事前に操作対象となる要素を特定しておく必要があります。同様に、Selenium
を利用する場合も、操作を行う際には事前に操作対象となる要素を探索(特定)しておく必要があります。そして、Selenium
の場合は、HTML の構造や HTML のタグの属性を利用して要素を探索することが多いです。
例えば、HTML のタグには id
属性を指定することが可能です。この id
属性を利用して、その要素にリンクを設定したりスタイル(見た目)を設定することが可能となります。この id
属性は、基本的には HTML の中に1つしか存在しないことになっているため、この id
属性を利用して要素の探索を行うことができます。
例えば、ボタンの要素のタグに id="send-button"
が指定されている場合、下記のように find_element
メソッドを利用して、そのボタン要素を探索して取得することが可能です。そして、取得した要素に対して click
メソッドを実行させれば、そのボタンをクリックすることができます。
# 要素を探索して取得
button = driver.find_element(by=By.ID, value='send-button')
# 要素に対する操作
button.click()
このように、要素を探索して取得し、取得した要素に対してメソッドを実行させて操作を行うという手順が基本的な Selenium
を利用したウェブブラウザ操作、特にウェブアプリ等の動作確認を行う操作の流れとなります。
また、上記では id
属性を利用して要素の特定を行っていますが、Selenium
には他にも要素を特定する手段がたくさん用意されています。これらに関しては、下記ページの Selenium
の使い方の解説ページで紹介していきたいと思います。
その他の Selenium
の特徴
その他にも、Selenium
では様々な操作を行うことが可能となっています。この辺りは、特にウェブアプリの動作確認用途として効果のある操作となると思います。
ウェブブラウザ自体への操作
ウェブブラウザには「戻る」ボタンでブラウザバックを行ったり、「更新」ボタンでページを再読み込みしたりすることができますが、こういった操作も Selenium
から実行可能です。
また、ウェブブラウザのウィンドウサイズを変更したり、ウェブブラウザのウィンドウサイズを取得するようなことも可能です。このような操作を行うことで、ウィンドウのサイズ変更後に、ページのレイアウトが崩れたりしないかどうか、なども確認することができます。
このあたりの操作に関してはウェブブラウザ操作を行う Selenium
独自のものであり、Requests
からは実行不可になります。
スクリーンショットの撮影
また、Selenium
にはスクリーンショットの撮影機能もあります。これにより、ウェブブラウザでのページの表示結果等をスクリーンショット画像として記録しておくことができます。
例えば、ウェブアプリを変更する際、変更前のページのスクリーンショット画像を保存しておけば、その画像と変更後のページのスクリーンショットとの比較を行うことで、ウェブアプリの変更によりページの構造や見た目が変化していないかどうかも自動的に確認することができます。
Selenium
の使いどころ
続いて、ここまでの説明を踏まえて Selenium
の使いどころについて説明していきます。ここでも Reqeusts
等のデータ通信を行うライブラリと対比しながら説明していきたいと思います。
スポンサーリンク
ウェブアプリの動作確認での使いどころ
Selenium
の使いどころの1つにウェブアプリの動作確認が挙げられます。
フロントエンドの動作確認
特に Selenium
はウェブアプリのフロントエンド側の動作確認に向いているフレームワークであると言えます。
ウェブアプリにおけるフロントエンドとは要は UI のことで、ユーザーが実際に目にしたり、ユーザーが操作を行う部分のことを言います。このフロントエンドは、基本的にはウェブブラウザ上に表示され、ウェブブラウザの操作によってユーザーから指示を受け付けることになります。
なので、開発者はフロントエンドの動作確認をウェブブラウザを操作して行うことになるのですが、ここまでの説明からも分かるように、この動作確認は Selenium
を利用して実施することが可能です。例えば、Selenium
から入力フィールドに文字列を入力したりボタンをクリックしたりして、これらを行った時の動作を確認することができます。
また、Selenium
はウェブブラウザ上にページを描画することができるため、フロントエンドの見た目の確認やスクリーンショットでの画像の保存等を行うこともできます。
このようなフロントエンドの動作確認は、まさに Selenium
が得意とする Selenium
の使いどころになると思います。もちろん、ウェブブラウザさえれば動作確認は可能なのですが、Selenium
を利用すれば、動作確認を自動化するようなこともでき、メリットが大きいです。
逆に、基本的に Reqeusts
が行えるのはデータ通信のみなので、これらのウェブブラウザに対する操作やページの描画結果の確認等は行うことができません。
バックエンドの動作確認
フロントエンドに対しウェブアプリのバックエンド側(サーバー側)の動作確認も Selenium
で実現することも可能です。ただし、バックエンド単体での動作確認に関しては Reqeusts
で実施した方が効率的かもしれません。
ウェブアプリでは、フロントエンド側で行った操作に対するデータがバックエンド側に送信され、それを受け取ったバックエンドが、受け取ったデータに対応した動作を行うことになります。そして、その結果に対応するデータをフロントエンドに返却することで、その結果に対応したページがウェブブラウザに描画されることになります。要は、今までの説明における「サーバー」がバックエンドに対応していると考えていただければ良いです。
つまり、バックエンド側への指示に関しては、フロントエンド側での操作によって実現することもできますし、直接バックエンドにデータを送信することでも実現することができます。そのため、Selenium
でフロントエンド側の操作を行うことでバックエンド側の動作確認を行なっても良いですし、Reqeusts
で直接バックエンド側にデータを送信してバックエンド側の動作確認を行うこともできます。
ただ、バックエンドに対する意地悪テストや負荷テストを行う上では Reqeusts
の方が向いているかもしれません。Selenium
を利用する場合、フロントエンド側の操作によってデータの送信が行われるため、バックエンドに対してはウェブブラウザが作成した適切なデータが送信されることになります。それに対し、Reqeusts
の場合は意図的に適切でないデータを作成して送信するようなことも可能なので、意地悪テストはやりやすいと思います。
また、Reqeusts
の方が処理が軽いため、大量のデータをバックエンドに送信するような負荷テストもやりやすいと思います。Selenium
の弱点の1つは、ウェブブラウザを起動したり操作したりするため、処理が重いことになると思います。
このような理由より、ウェブアプリをトータルのシステムとして動作確認するのであれば Selenium
を利用するのでも良いですが、バックエンド単体での動作確認は Reqeusts
の方が向いているのかなぁと思います。
ウェブスクレイピングでの使いどころ
続いてウェブスクレイピングでの使いどころについて解説していきます。
このウェブスクレイピングでの Selenium
の使いどころを考える上では、そのウェブスクレイピングを行う対象のページが静的なページであるか動的なページであるかが重要なポイントとなります。
この静的なページ or 動的なページの違いは、そのページが JavaScript の実行によって HTML の構造やタグの中身が変わるかどうかによります。JavaScript 実行後にウェブスクレイピングが可能 でも説明した通り、JavaScript が実行されることによって HTML の変更が行われるようなページが存在します。このようなページを、ここでは動的なページと呼んでいます。
動的なページに対するウェブスクレイピング
こういった動的なページに対してウェブスクレイピングを行いたい場合は Selenium
を利用する方が良いでしょう。
Selenium
を利用すればウェブブラウザが自動的に JavaScript 実行後の HTML を生成してくれるため、JavaScript 実行後の HTML に対して解析を行うことが可能となります。それに対し、Reqeusts
の場合は、Reqeusts
自体に JavaScript 実行の機能がないため、基本的には JavaScript 実行後の HTML に対しての解析は不可となります。
静的なページに対するウェブスクレイピング
また、静的なページに対してウェブスクレイピングを行うのであれば、Selenium
でも Reqeusts
のどちらを利用するのでも良いと思います。処理の軽さに拘りたいのであれば Reqeusts
の方が向いていると言えるでしょう。
ただし、特に Reqeusts
の場合はデータ通信を行うことに特化しているため、ウェブスクレイピング用の他のライブラリ、例えば Beautiful Soup
などと併用してウェブスクレイピングを行うことをオススメします。もちろん、Selenium
と Beautiful Soup
を併用することも可能なので、HTML の解析を Beautiful Soup
で行うようにしておけば、HTML の取得手段(Selenium
or Reqeusts
など)に関わらず、HTML の解析処理は共通的に行うことができるようになります。
PyAutoGUI
との違い
Selenium
は、人間が行なってきたウェブブラウザの操作をプログラムから実行することで RPA を実現するフレームワークであると言えます。
同様に、Python には RPA を実現するライブラリとして PyAutoGUI
も存在します。これらの違いについて、最後に解説を行なっておきます。
ここまでの説明を行なってきた通り、Selenium
はウェブブラウザの操作に特化したフレームワークとなります。ウェブブラウザ自体を直接操作したり、ウェブブラウザに表示されるボタン等の要素を操作したり、HTML を取得したりするようなことが得意です。
それに対し、PyAutoGUI
の使い道はもっと汎用的で、人間が行うパソコン上の操作(マウス操作やキーボード操作)のほとんどをプログラムから実行可能とするライブラリとなります。ウェブブラウザの操作もマウス操作やキーボード操作によって実現されるのですから、PyAutoGUI
の利用によって、ウェブブラウザの操作をプログラムから実現することも可能です。
ただし、ウェブブラウザの操作に関しては PyAutoGUI
よりも Selenium
の方が向いています。Selenium
であれば、操作対象となる要素を HTML の特性や構造を利用して特定することができます。例えば、タグに付加された id
属性でクリック対象のボタンなどを特定することができます。また、ブラウザバックなどを行う場合も、単にメソッドを実行するだけで実現可能です。
それに対し、PyAutoGUI
の場合は、要素の特定は基本的に画像認識や座標の指定によって行う必要があります。特に画像認識を行うためには、あらかじめ操作対象となる要素の画像を用意しておく必要があって面倒です。また、画像認識の精度によっては、要素の特定に失敗したり、目的の要素とは異なる要素を特定してしまうようなこともあるでしょう。
ですが、Selenium
であれば、HTML の構造がおかしくなければ、基本的に id
属性等のユニークな識別子によって確実に要素を特定することが可能です。
また、PyAutoGUI
の場合は、直接 HTML を取得したり HTML を解析したりするようなことも出来ないため、ウェブスクレイピング等を実現する際にも Selenium
の方が向いていると言えます。
ただし、Selenium
の場合は、あくまでもウェブブラウザの操作に特化しているため、ウェブブラウザ以外で動作するアプリの操作は Selenium
では実現不可です。例えば、デスクトップアプリなどの動作確認に関しては、PyAutoGUI
の方が確実に向いていると思います。
要は、自動化したい作業に合わせて使用するライブラリやフレームワークを適切に選択することが重要ということです。これは、今回紹介したウェブブラウザの操作だけでなく、他の作業を自動化する上でも重要なポイントになります。ただ、この選択を適切に行う上では、Python に存在するライブラリ・フレームワークの種類、さらには、これらのライブラリ・フレームワークの特徴の知識が必要となります。
おすすめ書籍(PR)
こういった知識を身につけたいのであれば、個人的には下記の 退屈なことはPythonにやらせよう 第2版 の参考書を読んでみることをオススメします。
この参考書では、このページで紹介した Selenium
だけでなく、今回比較対象として取り上げた Requests
、さらには前述で少し触れた PyAutoGUI
についても解説されています。
また、それだけでなく、Excel や Word、電子メール、画像等に関する自動化についても解説が行われており、自動化に利用できるライブラリを幅広く知るという意味で非常にオススメな参考書になります。正直、1つ1つのライブラリ・フレームワークに対する解説は薄めです。特に Selenium
に関する解説は少ないです…。ですが、それでも Python でどんな作業が自動化できるのかについてを網羅的に学ぶことができるという点でオススメの参考書になります。ライブラリの存在を知っていれば、詳細な情報に関しては後でいくらでもネット上から拾うことができると思います。
序盤では Python の使い方やプログラミングについても解説されていますので、Python に慣れているから Python で作業効自動化・業務効率化を行いたいという人だけでなく、これらに興味がある Python 初心者の方にもオススメの参考書となります。
スポンサーリンク
まとめ
このページでは、Selenium
の紹介を行いました!
Selenium
はウェブブラウザの操作を Python スクリプトから実行可能とするフレームワークであり、これによりウェブアプリの動作確認やウェブスクレイピング等を実現することが可能となります。また、これらをプログラムから実行させることで、作業や業務の自動化を行うこともできます。
Selenium
の特徴はなんと言ってもウェブブラウザの操作をプログラムから実行できる点であり、単にデータの通信を行うライブラリとは一線を画す存在であると言えるでしょう!
Selenium
を使うことで、いつもウェブブラウザを操作している時と同様の感覚で直感的に実装を行うことができます。また、ページの描画やページの要素に対する操作も行うことができるため、特にウェブアプリのクライアント側の動作確認に向いていると思います。さらに、操作対象のウェブブラウザが JavaScript を実行してくれるため、JavaScript 実行後の HTML に対して解析を行いたいような場合も Selenium
が活躍してくれます。
Selenium
の使い方に関しては下記ページで解説していますので、Selenium
に興味を持たれた方は下記ページも是非読んでみていただければと思います!