Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

PythonとSeleniumでスクレイピング:ブラウザ操作を完全自動化

selenium python

ブログ管理者のP.Hです!

今回はPythonとSeleniumでスクレイピング(ブラウザ操作を自動化する方法)する方法を紹介したいと思います。Seleniumは、Webアプリの自動テストで使われていましたが、現在ではWebページの情報を自動収集したり、作業を自動化する時によく使われます。今回はWindowsでChromeを操作する方法を紹介します。

それでは、PythonとSeleniumでChromeを自動操作してみましょう。
※下記の操作はWindowsで行っています。

動作環境の準備

Seleniumのインストール

コマンドプロンプトで下記コマンドを実行します。これでseleniumのインストールは完了です。

> pip install selenium  

Chromeのバージョン確認

下記の写真の通りにボタンをクリックして、バージョンを確認します。WebDriverのインストール時に必要な情報になります。

chrome version1

chrome version2

WebDriverのインストール

seleniumでブラウザを自動操作するには、WebDriverというモジュールが必要になります。下記のWebページからWebDriverをダウンロードしてください。解凍したchromedriver.exeがWebDriverになります。

sites.google.com

ダウンロードするときに、注意する点が2つあります。

注意事項

  • 上記で確認したChromeのバージョンと同じバージョンのWebDriverをダウンロードしてください。
  • Path(環境変数)を設定する必要があります。任意の場所にchromedriver.exeを格納する場合は、環境変数を設定してください。よくわからない場合は、C:\Windows\System32\にchromedriver.exeをコピーしてください。

Seleniumの基本

Seleniumは、Web上の要素(ボタンやテキストボックス等)を指定して操作をします。要素を指定する方法は、主に以下の3つです。

  • ID名 ⇒ 同じid名を複数の要素に設定することはできません。id名で指定すれば、要素はかならず特定されます。id名で指定する方法がもっとも確実です。
  • Class名 ⇒ 複数の要素が同じクラス名である可能性があります。
  • Xpath ⇒ かならず1つの要素に決まりますが、Webのデザイン(構成)が変わった場合は、Xpathが変わる可能性があります。Webデザインの構成が変わる可能性があるときは、注意が必要です。

これ以外にもありますが、今回はこの3つを紹介します。ID名、Class名、Xpathの調べ方については下記で説明します。

サンプルコード

下記がサンプルコードになります。下記の動作をします。

  1. 青丸のテキストをID指定で取得
  2. 緑丸のテキストをClass名指定で取得
  3. 黄丸のテキストをXpath指定で取得
  4. 桃丸の入力ボックスに"text"と入力して、Enterキーを押す

sample code
コード内にコメントを記載しましたので、参考にしながら見てください。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# WebDriverの読み込み
driver = webdriver.Chrome()

# 指定している要素が表示されるまでの待ち時間(秒)
# ページの切り替わり等で要素が表示されるまで自動的に待ってくれる
driver.implicitly_wait(10)

# get(url) urlのページを表示
driver.get('https://www.google.com/')

# 現在ページのurlを取得
print('URL: ', driver.current_url)

# 現在ページのタイトル
print('Title: ', driver.title)

# IDで指定した要素の文字列取得
val = driver.find_element_by_id('hptl').text
print('Element ID: ', val)

# クラス名で指定した要素の文字列取得
val = driver.find_element_by_class_name('gb_g').text
print('Element Class: ',val)

# Xpathで指定した要素の文字列取得
# Xpathはlist型に格納されるようで、[0]が必要
val = driver.find_elements_by_xpath("//*[@id='gbw']/div/div/div[1]/div[2]/a")[0].text
print('Element Xpath: ',val)

# Xpathで指定した要素(検索入力ボックス)を取得
element = driver.find_elements_by_xpath("//*[@id='tsf']/div[2]/div[1]/div[1]/div/div[2]/input")[0]
time.sleep(1)
# 要素に"test"というテキストを入力
element.send_keys("test")
# Enterキーを押す
element.send_keys(Keys.ENTER)

# Chrome閉じる
driver.close()
driver.quit()

要素の調べ方

上記で要素を取得するために、ID、Class名、Xpathを使用しています。これを調べる方法を説明したいと思います。

自分の操作したい要素(青丸)を右クリックし、検証ボタン(緑丸)を押します。Chromeのデベロッパーツールが開きます。

find element1
デベロッパーツールのElementsタブで、要素のIDやClass名が確認できます。これを使用して、Seleniumで要素を操作します。

find element2
Xpathを調べたい場合は、デベロッパーツールで調べたい要素の部分で右クリックし、Copy ⇒ Copy XPathをクリックします。クリップボードにXPathがコピーされますので、エディタに貼り付けるとXpathを知ることができます。

find element3

# XPathをPythonコードで使用する時は、ダブルクォーテーションをシングルクォーテーションに変えて使用してください。
//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input
         ↓
//*[@id='tsf']/div[2]/div[1]/div[1]/div/div[2]/input

Seleniumの使い方を紹介しました。今回の説明はSeleniumの機能のごく一部ですが、基本がわかってしまえば後は応用できます。pythonで書いているので、pythonでエクセルの値を読み込んで、Webに入力することもできます。Webページのソースを取得するなんてこともできます。Seleniumを使えば、Webのほとんどの操作を自動化できますので、使ってみてはいかがでしょうか。

最後にSeleniumの使い方で参考になったページを紹介しておきます。

Selenium webdriverよく使う操作メソッドまとめ - Qiita

http:// https://kurozumi.github.io/selenium-python/api.html

以上でSeleniumの説明を終わります。