はじめに
Pythonのseleniumモジュールを使用して、Chromeを操作する方法をまとめています。
Pythonの基礎がわかる人であれば理解できる内容にしています。
実在するサイトを用いて操作手順を記載しています。
注意事項として、変なプログラム(連続してリクエストを投げるなど)を実行してしまうとWebサイトに負荷がかかる可能性があります。また、DoS攻撃と判断される可能性もあります。
プログラムを実行する前には間違いがないか注意してください。
seleniumインストール
インストール方法は以下を参照してください。
[selenium向け] ChromeDriverをpipでインストールする方法(パス通し不要、バージョン指定可能)
https://qiita.com/hanzawak/items/2ab4d2a333d6be6ac760
[超図解]AnacondaインストールからPythonプログラム実行までの手順(Windows版)
https://qiita.com/hanzawak/items/9dedcde1a43aa7d0e71a
selenium概要
seleniumはWebサイトのテストを自動化するためのツールです。
以下の流れでブラウザを操作します。
- 操作したいブラウザを開く
- 操作したいページを開く
- 操作したい要素を確認する
- 操作したい要素を指定する
- 操作したい要素を操作する
selenium基本操作
0. seleniumインポート
from selenium import webdriver
import chromedriver_binary # ChromeDriverをpipでインストールした場合はchromedriver_binaryもインポートしてください
1. 操作したいブラウザを開く
まずはブラウザを開きます。
driver = webdriver.Chrome()
以下のような画面が表示されます。
2. 操作したいページを開く
操作したいページを開きます。今回は楽天を開きます。
driver.get("https://rakuten.co.jp")
楽天が開きます。
3. 操作したい要素を確認する
「キーワードから探す」の部分に文字を入力してみたいと思います。
「キーワードから探す」の要素を確認するには、ページのソースを見る必要があります。
Chromeの場合は開発者ツールを用いることで簡単に確認できますので、その使用方法を記載します。
I. F12キーをクリックする
画面右側に開発者ツールが開きます。
II. マウスカーソルボタンをクリックする
以下の赤丸部分を1回クリックしてください。するとマウスカーソルボタンが青色になります。
III. 要素を確認したい箇所をクリックする
マウスカーソルボタンが青色の状態の時に、左側の画面で要素を確認したい箇所をクリックしてください。
今回はキーワードを入力したいので、「キーワードから探す」の部分をクリックします。
IV. ソースを確認する
画面右側の一部が青くハイライトされています。
この部分が「キーワードから探す」のソースです。
V. 要素を確認する
以下は「キーワードから探す」のソースの部分です。
<input type="text" value="" name="sitem" size="40" class="searchInput" id="sitem" placeholder="キーワードから探す" autocomplete="off" maxlength="2048">
seleniumで操作する際に使用できる要素としては以下がありました。
- name="sitem"
- class="searchInput"
- id="sitem"
上記以外にもXPathというXMLの特定の部分を指定する方法があります。
(XPathはソースに表示されません)
確認方法は、画面右側の青くハイライトされた部分を右クリックし、Copy→Copy XPath で確認できます。
コピーした内容は //*[@id="sitem"]
でした。
4. 操作したい要素を指定する
前の項目で取得できた以下4つの要素のいずれかを用いて、操作したい要素を指定します。
- name="sitem"
- class="searchInput"
- id="sitem"
- XPath -> //*[@id="sitem"]
今回はclassで要素を指定します。
x = driver.find_element_by_class_name('searchInput')
5. 操作したい要素を操作する
「switch lite」という文字を入力する場合は以下のようにします。
x.send_keys('switch lite')
以上がseleniumを使用する際の基本操作です。
要素を確認して、指定して、操作する、というだけの流れです。
selenium応用
まずはselenium基礎のコマンドについて、もう少し他の方法がありますのでその説明をします。
要素指定と要素の操作を1つにまとめる
「4. 操作したい要素を指定する」と「5. 操作したい要素を操作する」は2つの処理を1行にすることができます。
以下のように記載すると、「キーワードから探す」を指定して、「switch lite」を入力できます。
driver.find_element_by_class_name('searchInput').send_keys('switch lite')
class_name以外の要素の指定
「4. 操作したい要素を指定する」ではclass_nameを指定しましたが、name, id, XPathでは以下のようにして指定ができます。
driver.find_element_by_name('sitem').send_keys('switch lite')
driver.find_element_by_id('sitem').send_keys('switch lite')
driver.find_element_by_xpath('//*[@id="sitem"]').send_keys('switch lite')
seleniumを使用した色々なブラウザ操作
入力されている文字を消す
「キーワードから探す」に入力されている文字を消す方法です。
class_name, name, id, xpathの順で記載しています。
driver.find_element_by_class_name('searchInput').clear()
driver.find_element_by_name('sitem').clear()
driver.find_element_by_id('sitem').clear()
driver.find_element_by_xpath('//*[@id="sitem"]').clear()
ボタンのクリック
検索ボタンをクリックしてみたいと思います。
前の手順と同じように開発者ツールから検索ボタンの様子を確認すると、class=searchBtn
でした。
そのためclass_name
でsearchBtn
を指定し、末尾にclick()
をつけるとボタンをクリックできます。
driver.find_element_by_class_name('searchBtn').click()
値段の一覧を取得
いつも通り開発者ツールからマウスカーソルボタンを押して、今度は値段の部分をクリックします。
するとclass=important
であることがわかります。
テキストの情報を取得するには以下のように記載します。末尾がtext
になります。
driver.find_element_by_class_name('important').text
これを実行すると「21,978円」と表示されます。
次に2件目の値段を取得するために、開発者ツールからマウスカーソルボタンを押して、2件目の値段の部分をクリックします。
まさかの2件目もclass=important
でした。
この場合、今までの方法ですと2件目の値段が取得できません。
どうやって解決するかというと、element
をelements
というように末尾にs
をつけます。そして.text
の前を[0]
[1]
といったようにします。
以下のようにすると値段の1件目、2件目、3件目が取得できます。
driver.find_elements_by_class_name('important')[0].text
driver.find_elements_by_class_name('important')[1].text
driver.find_elements_by_class_name('important')[2].text
なぜか楽天の検索結果には「1〜45件」と記載されていますが、数えてみると48件表示されていますので、以下のようにするとprices
に全ての価格を記録できます。
prices = []
for i in range(48):
prices.append(driver.find_elements_by_class_name('important')[i].text)
print(prices)
楽天が修正する可能性を考えると以下のようにtry-exceptを使用した方が安全かもしれません。
prices = []
i = 0
while True:
try:
prices.append(driver.find_elements_by_class_name('important')[i].text)
i += 1
except:
break
プルダウンメニューの操作
価格のソートをしてみようと思います。
プルダウンメニューを操作する時には、「要素」と「変更したいvalue」の情報が必要になります。
「要素」はいつものように「並べ替え」の横の「標準」の部分で調べると、class=sorting
ということがわかります。
「変更したいvalue」はclass=sorting
の左側の三角ボタンを押して詳細を表示し、その中からvalue
を選択します。
今回は「価格が安い順」にしてみたいのでvalue
はhttps://search.rakuten.co.jp/search/mall/switch+lite/?s=2
ということになります。
「要素」と「変更したいvalue」の情報が入手できましたのでプルダウンメニューを操作します。
以下のように記載すると「価格が安い順」が選択されます。
なおSelect
をインポートする必要があります。
from selenium.webdriver.support.ui import Select
price_sort = driver.find_element_by_class_name('sorting')
price_sort_select = Select(price_sort)
price_sort_select.select_by_value('https://search.rakuten.co.jp/search/mall/switch+lite/?s=2')
チェックボックスを操作
画面左側の「送料無料」のチェックボックスにチェックを入れたいと思います。
その場合はいつも通り要素を確認し、末尾にclick()
を記載します。
driver.find_element_by_name('f').click()
チェックが付いた状態で再度上記を実行するとエラーになります。
そのため以下のようにしても良いと思います。
try:
driver.find_element_by_name('f').click()
except:
print('checked')
前のページに戻る・先のページに進む
driver.back() # 前のページに戻る
driver.forward() # 先のページに進む
URLの取得
現在表示しているページのURLを取得できます。
driver.current_url
ページタイトルの取得
現在表示しているページのタイトルを取得できます。
driver.title
マウス操作をする
画面上部の「買い物かご」にマウスカーソルを合わせてみようと思います。
まずいつも通り「買い物かご」の要素を確認するとclass=basket-link
でした。
この情報を用いて以下のように記載して実行します。
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://rakuten.co.jp")
actions = ActionChains(driver)
actions.move_to_element(
driver.find_element_by_class_name("basket-link")
).perform()
すると「買い物かご」の部分が色が薄くなっていると思います。
自分でマウスカーソルをいじってみるとわかりますが、「買い物かご」の上にマウスカーソルをあてると色が薄くなります。
マウスカーソルは表示されないですが、カーソルがあたった時と同じ動作になっていることがわかります。
スクリーンショットを撮る
同じフォルダにスクリーンショットが保存されます。
driver.save_screenshot('test.png')
画面をスクロールする
driver.execute_script("window.scrollTo(0, 1000);")
DoS攻撃と間違われないようにするために
サイトに負荷を与えないように、またDoS攻撃と間違われないようにするために、処理の途中にsleepをはさむのも良いと思います。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://rakuten.co.jp")
time.sleep(5)
driver.find_element_by_class_name('searchInput').send_keys('switch lite')
time.sleep(5)
driver.find_element_by_class_name('searchBtn').click()
ブラウザを閉じる
driver.quit()