【Python】「Selenium」を使ってブラウザを自動操作する方法

Seleniumでのブラウザを自動操作する方法

PythonでGoogleクロームやIE・Firefoxなどのウェブブラウザは「Selenium」というライブラリを使って自動操作することができます。ということで今日は「Selenium」のインストール方法と使い方、Seleniumで起動したブラウザでの検索ボックスに文字入力→クリックする方法などを分かりやすく解説していきたいと思います。

Seleniumの使い方

まずはコマンドラインからpipでSeleniumをインストールします。

#seleniumをインストールする
pip install -U selenium

ライブラリをダウンロードしたら次はウェブドライバー(Webdriver)をダウンロードします。以下のURLにアクセスし、pythonのところ(https://pypi.org/project/selenium/)をクリックしてください。→https://pypi.org/project/selenium/

するとブラウザに合わせた、バージョンが選択できるので、クロームなりFirefoxなりを選択し、次はOSに対応したものを選択します。私はWindows10なので、Win32.zipをダウンロードしました。

ブラウザは基本自分の好きなものを選べばいいと思いますが、Seleniumを使って文字入力を行う場合、サイトのソースが一番見やすいのはGoogleChromeなので、個人的にはクロームは一番推奨です。

そして、ダウンロードしたzipファイルを解凍して展開し、中にあるexeファイルを起動します。コマンドプロンプトみたいな黒い画面が表示されて、そこのメッセージの中にon port 9515という記述があればOKです。

ちなみにChromeDriverをPythonでのみ利用するなら、「pip install chromedriver-binary」 でインストールでき、「import chromedriver_binary」 でインポートするという方法もあります。

次はコマンドプロンプトからSeleniumを実行します。「Jupyter Notebook」とかから起動するとパスの問題でエラーになることがあるので、アナコンダプロンプトや「spyder」から起動するのが無難です。「$ユーザー>python」でpythonを起動します。起動したら以下のコードを実行します。

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

drv=webdriver.Remote("http://127.0.0.1:9515",DesiredCapabilities.CHROME)

これで以下のようなブラウザが起動すれば成功です。

MaxRetryError: HTTPConnectionPool(host=’127.0.0.1′, port=9515): Max retries exceeded with url: /session (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x0000017EFE1BE198>: Failed to establish a new connection: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。’,))
また以上のようなエラーが起きた場合は以下のコードで代用してみてください。

#ライブラリのインポート
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


#クラスを定義する
drv = webdriver.Chrome()

Seleniumを操作する

seleniumの実行環境を準備は整ったので、次は実際にSeleniumでブラウザを操作していきたいと思います。

#Amazonにアクセスする
drv.get("http://www.amazon.co.jp")

これでページにアクセスできました。ただこれだけだとSNSとかのログインに必要なユーザーネーム(またはメールアドレス)とパスワードをブラウザ上で入力してログインしたり、Amazonで検索ボックスにキーワードを入力して商品を検索、みたいなことはできません。

Seleniumで以上のような「サイトのボックスに文字を入力してクリックしてページを移動するなどといった操作」を行うためには、サイトのhtmlのソースコードを検証し、目当てのボックスにkeyを送信するという操作を行う必要があります。

クリックや文字入力などのアクションを起こすHTMLの要素に指定するには id、class、name 等から指定する事ができますが、個人的にはXpathで指定したほうがエラーが起こる可能性が低いと思うのでオススメです。単純なサイトならidなどで要素を指定できるのですが、TwitterやAmazonのようなややこしいソースのサイトはxpathでやっています。

XPathとは何か?

XPath(XML Path Language)とは、XML形式の文書から特定の部分を指定して抽出するための簡潔な構文(言語)です。HTML形式の文書にも対応しています。CSSではセレクタを使ってHTML文書内の特定の部分を抽出しますが、XPathはより簡潔かつ柔軟に指定ができるので、「Selenium」などでブラウザの自動操作ではエラーが起こりにくいです。

スポンサーリンク

Seleniumの引数に使うXPath(要素)の調べ方

XPathの調べ方は表示されているページのhtmlを見て調べるのが手っ取り早いです。例えば先ほどアクセスしたAmazonのサイトの上記の検索ボックスに検索したい文字を入力するとします。

まずGoogleクロームの場合であれば、右クリックの検証というところをクリックするとページのソースを確認できます。そして文字を入力したい検索ボックスの要素を調べるには検索ボックスにマウスのカーソルを合わせて右クリックでもう一度検証をします。

すると、対応するソースがドラッグされて表示されます。ブラウザで文字が入力をするボックスは基本的に<input>タグなので、<input>で囲まれたタグがドラックされていればそれが目当ての要素で間違いないでしょう。

今回欲しい目当ての要素はXPathなので、ドラッグされた部分を右クリックして「コピー→XPathをコピー」するとクリップボードに目当ての文字入力ボックスのXPathがコピーされているので、それを引数に設定します。

今回のAmazonの検索ボックスの要素のXPathは「//*[@id=”twotabsearchtextbox”]」だと分かりました。というわけで、Amazonでサイト上部の検索ボックスに文字を入力して検索したい場合は以下のように記述します。今回は「python Selenium」と入力して商品を検索してみます。

#Amazonで検索したいキーワードを検索ボックスに入力する
word=drv.find_element_by_xpath("//*[@id=\"twotabsearchtextbox\"]")
word.send_keys("python selenium")

次は「drv.find_element_by_xpath()」の引数に文字を入力したいボックスのXpathを指定し、「.send_keys()」の引数にブラウザに入力したい文字を入力します。クリックボタンのXPathは先ほどと同じ要領で、ページを右クリックでHTMLを検証した状態でクリックのボタンをさらに右クリックで検証して、ドラッグされたソースのHTMLの部分をさらに右クリックで「コピー→XPathをコピー」で取得することができます。コードで書く際はXPathの指定と入力する文字を一緒くたにするとコードが長くなるので、変数で2行に分けたほうが見やすいでしょう。

#要素を指定してクリックする
path=drv.find_element_by_xpath("//*[@id=\"nav-search\"]/form/div[2]/div/input")
path.click()

実行するとブラウザで表示しているAmazonの検索ボックスに「python Selenium」と入力されて横のクリックボタンがクリックされ、検索結果が表示されます。

そして、Seleniumで開いたWebブラウザを閉じる際は以下のコード実行します。

#Webページを閉じる
driver.close()

#Webドライバーを終了する
driver.quit()

終わり

以上がSeleniumの基本的な使い方です。文字を入力したい場合、ターゲットとなる文字を入力するボックスはclassよりもxpathで指定したほうがcssとかの影響を受けないので、動作が安定するかもしれません。

にしてもPythonは「requests」といい「Selenium」といいWebスクレイピングを便利にしてくれるライブラリがたくさんあるので、データ集めにはもってこいのプログラミング言語だと思いますね。

あと一応スクレイピングでは、著作権の問題や、サーバー側の負荷、各種規約(会員としてログインする場合の会員規約等)やマナーなどを考慮する必要があります。たとえば、Twitter などは利用規約で明示的にスクレイピングが禁止されていますし、APIが用意されている場合はAPIを使ってスクレイピングしたほうがいいです。

自分はこのサイト以外にもサーバーも運営していたりで、スクレイピングされる側・する側両方の気持ちもわかりますが、あくまでスクレイピングはサイトのサーバーに負担を掛けないように節度と良識を持って行うようにしましょう。

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。



それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」「エンジニアとして若いうちから高収入を得たい」という気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. KelabSevE より:

    Dexamethasone buy viagra Amoxicillin Child Achat Levitra En Suisse Tamoxifen Buy Online