前回はPyAutoGuiを利用してパソコンの操作を自動化しました。
今回は「ブラウザ」の自動化について書いていきたいと思います。
もう時代も令和なので、なんでもかんでも自動化していきましょう(笑)
ブラウザとは
ブラウザの自動化の前に「ブラウザ」という言葉がわからない人がいる
かもしれませんので少し説明します。
ブラウザというのはWebを見るために使用するアプリのことです。
つまり、スマートフォンやパソコンでこの文章を読んでいる
あなたが今利用しているアプリ、それをブラウザと呼びます。
つまり、、、、、。
こんなやつ!見覚えないやつもあるかもですが、ネット見る時にクリックするやつと覚えておけば、問題ないです。
ブラウザには Chrome、Safari、Edge, FireFox、Opera等
たくさんの種類がありますが、世界で最も利用されているブラウザが
Chromeです。(参考統計データ)今回はChromeを自動化させていきます。
ブラウザを自動化させる目的
1.テストを自動化するため
エンジニアの方にとって、ブラウザを自動化させる主な理由は「動作検証テスト」の為です。WEBサイトを新しく構築した際に希望通りに動作するか実際に確認する必要がありますよね?
例えば、
- フォームに文字を入れて送信ボタンを押したらメールが届くこと
- パスワードが間違って入力されたらエラーを出す
- パスワードが正しい場合はようこそを表示される
など、WEBサイトの各項目が正常に動作するか確認します。
もし、WEBサイトの機能が膨大にあった場合はひとつひとつ手作業で各項目を
調べていくのはとても手間がかかります。
ここで登場するのがブラウザの自動化です。
ブラウザにさせたいことをプログラムすることで、手間のかかる確認作業を
自動で行うことが可能です。
2.WEBからの情報取得を自動化する
もうひとつの理由は「WEBに掲載されている情報を自動で取得する」
というものがあります、ちなみにWEBから情報を取得することを「スクレイピング」と呼びます。
WEBを自動的に動作させる中で、表示されている情報を自由に取得することが可能です。定期的にプログラムを実行させるcronやタスクスケジューラと合わせて利用することで一定間隔で自動的にデータを取得することもできます。
Seleniumが使えるように環境を整える
今回は自動化にSeleniumというツールを利用します。
そして、言語はPythonを利用していきますので、まずは環境を整えていきます。
下記のコマンドを実行してSeleniumをインストールします。
1 |
pip install selenium |
上のコマンドを実行するとseleniumがインストールされますが、
他に必要なものがあります。先ほど説明した通り、ブラウザにはたくさんの種類がありますので、それぞれのブラウザに適したドライバというものが必要になります。chromeを利用する場合はchromeドライバというものが必要になります。
https://sites.google.com/a/chromium.org/chromedriver/downloads
上のリンクからダウンロードできるので用意しておきましょう。これで準備は完了です。早速動かしていきましょう。
Seleniumでブラウザを操作する
それでは次のプログラムを書いてください。
1 2 3 4 |
from selenium import webdriver driver = webdriver.Chrome("./chromedriver") driver.get('http://seleniumhq.org/') |
今回はtest.pyという名前で作りました。実行する前にダウンロードしたドライバーは
プログラムと同じフォルダに入れておいてください。
下記のようにブラウザが立ち上がればOKです。
ポイントはアドレスバーの下にある部分です。
「Chromeは自動テストソフトウェアによって制御されています」
この文章が出ていたら自動制御ができているということになります。
それでは続いて次のプログラムを入力しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome("./chromedriver") driver.get('https://google.com') wait = WebDriverWait(driver, 10) # 指定された要素(検索テキストボックス)が表示状態になるまで待機する element = wait.until( expected_conditions.visibility_of_element_located((By.NAME, "q"))) # 要素を取得する element = driver.find_element_by_name('q') element.send_keys("沖縄 イベント") # エンターを押す element.send_keys(Keys.ENTER) # 3秒待つ time.sleep(3) # タグ名が「h3」要素の中で最初に見つけた要素を取得 element = driver.find_elements_by_tag_name("h3") # 取得した要素をクリック element[0].click() |
このプログラムを実行するとgoogleで「沖縄 イベント」をけんさくして一番上のリンクをクリックします。
このように簡単なプログラムで簡単にブラウザを自動操作することが可能です。
WEBから情報を自動で取得する
続いてWEBの情報を取得してみましょう。
次のプログラムを書いてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time # エクセル出力ライブラリ import openpyxl as excel driver = webdriver.Chrome("./chromedriver") driver.get('https://google.com') wait = WebDriverWait(driver, 10) # 指定された要素(検索テキストボックス)が表示状態になるまで待機する element = wait.until( expected_conditions.visibility_of_element_located((By.NAME, "q"))) # 要素を取得する element = driver.find_element_by_name('q') element.send_keys("沖縄 イベント") # エンターを押す element.send_keys(Keys.ENTER) # 3秒待つ time.sleep(3) # タグ名が「h3」要素の中で最初に見つけた要素を取得 element = driver.find_elements_by_tag_name("h3") # 取得した要素をクリック element[0].click() # 10秒待つ time.sleep(10) # ページのsectionタグを取得する element = driver.find_elements_by_css_selector("section div:nth-child(2)") element2 = driver.find_elements_by_css_selector( "section div:nth-child(2) li:nth-child(2)") element3 = driver.find_elements_by_css_selector( "section div:nth-child(2) li:nth-child(3)") element4 = driver.find_elements_by_css_selector( "section div:nth-child(2) li:nth-child(4)") # 新規ワークブックの作成 wb = excel.Workbook() # アクティブなワークシートを設定 ws = wb.active for index, e in enumerate(element): print(e.text) # A1のセルに値を書き込む ws["A" + str(index + 1)] = e.text ws["B" + str(index+1)] = element2[index].text ws["C" + str(index + 1)] = element3[index].text ws["D" + str(index+1)] = element4[index].text # エクセルファイルを保存 wb.save("event.xlsx") |
プログラムの重要な部分として、必要な情報をCSSセレクタ、またはxpath等で指定してあげることです。今回の場合はイベントの概要、開催地、開催日時、終了日時をCSSセレクタと呼ばれる指定の方法で取得しました。このプログラムを実行すると、先ほど自動化で開いた沖縄のイベントのページ情報を概要、開催地、開始日時、終了日時をまとめて、エクセルのファイルに出力してくれます。
このように自動化だけでなく、webスクレイピングも簡単に行うことができます。
データが取得できるということは、これを元にメールを送信したり、グラフを描画することも可能です。
何か作りたいものがあるときに「データ集めが面倒」と思っていた方、是非スクレイビングをまなんでデータ分析等、一歩進んだプログラミングしてみませんか?