【Python×Selenium】Chromeのブラウザ操作を自動化する方法

今回はPythonを使ってブラウザ操作を自動化するっていうことをやっていきたい。以前Chromeの拡張機能を使ってブラウザを操作するっていうことをやったけど今回はプログラミングの力を使う。

Pythonでやろうと思うんだけど、スクレイピングなんかはこっちでそういえばやってしまったよなあ。スクレイピング軽く試してみたいっていう場合にはこっちの記事に少し書いてあるから参考になるかもしれない。

Pythonのインストールからブラウザの自動操作をするところまでやっていこうではないか。ちょっと長い道のりになるかもしれないが、まあいいだろう。

Python・Seleniumをインストールする

今回はWindowsを使ってやっていこうと思うんだけど、Macの場合のPythonインストールはこっちに書いたからMac使っている人は参考になるかもしれない。(プログラム書くとき大体Mac使うんだよなあ・・・)

python.orgのDownloadsからPythonをダウンロードしよう。

ダウンロードしたexeファイルをクリックしたら画面に従ってインストールすればOK。

コマンドプロンプトからpythonを使うことができるか確認しよう。

python --versionとか打ってみる。

使えるようだから次はブラウザを自動化するために必要なものを入れていこう。

seleniumをインストールする

Seleniumを使いたいからインストールしよう。コマンド一発でインストールできる。

$ pip install selenium

Seleniumはサイトを見てみればかいとある通りブラウザの自動化をしてくれるやつ。Selenium automates browsersとか書いてありますね。もちろんコードをいろいろ書いたりする必要はあるけど。

どんなことができるのかや、どういった操作をすることができるのかはドキュメントのWebDriverあたりをざっと見ておくのがいいんじゃないだろうか。

SeleniumをインストールしたらWebDriverを入れるぞ。

ChromeのWebDriverをインストールする

今回はブラウザを操作するということで操作するためのドライバーが欲しい。ブラウザごとにドライバーがあったりするけど、今回はChromeを使ってブラウザ操作したいからChromeのドライバーをインストールしよう。ChromeDriverからダウンロードすることができる。

いくつかバージョンがあるけど、使っているChromeのバージョンに合わせてダウンロードしよう。ChromeのバージョンはChromeの右上から[Google Chromeについて]をクリックすると見ることができる。

ダウンロードする際にはMacやLinuxやら自分が使っているものに合わせてダウンロードしよう。今回はWindowsだからwinって書かれているものにする。

ちなみにダウンロードしたファイルからアプリケーションを実行してみるとコマンドプロンプトにこんな表示が出てくる。(プログラムから使うから実行する必要はないよ)

Security Considerationsを安全に保つためには読んでおいた方がいいよみたいなことが書かれているから見てみるとこんな感じ。

ChromeDriver is a powerful tool, and it can cause harms in the wrong hands. While using ChromeDriver, please follow these suggestions to help keeping it safe:

    • By default, ChromeDriver only allows local connections. If you need to connect to it from a remote host, use --allowed-ips switch on the command line to specify a list of IP addresses that are allowed to connect to ChromeDriver.
    • If possible, run ChromeDriver with a test account that has no access to sensitive local or network data. ChromeDriver should never be run with a privileged account.

    • If possible, run ChromeDriver in a protected environment such as Docker or virtual machine.

    • Use firewall to prevent unauthorized remote connection to ChromeDriver.

    • If you are using ChromeDriver through third-party tools such as Selenium Server, be sure to protect the network ports of those tools as well.

    • Use the latest versions of ChromeDriver and Chrome.

Security Considerations

目を通しておくのがいいかもね。

PythonでSeleniumを試してみる

この3つのインストールでブラウザを自動化するためのスタート地点には立った。

  • Python
  • Selenium
  • WebDriver

後はこれらを使ってコードをゴリゴリと書いていけば、ブラウザを操作できるはず。ただ現時点でSeleniumを使ったブラウザ操作の方法をあまり知らないから、よく使いそうなものぐらいは使い方を確かめていこう。

サイトを開く

サイトを開くにはget(開きたいサイトのURL)を指定すればそのサイトを開くことができる。例えば、これを実行してみるとYahoo!のサイトが開く。

from selenium import webdriver

driver = webdriver.Chrome('WebDriverへのパス')
driver.get("https://www.yahoo.co.jp/")

要素を指定する

どこかの要素から値を抜き出したいとかなったら、その要素を指定しなければいけない。これはJavaScriptでIDやClassを指定して検索するときと同じようなノリでいける。classを指定してその要素を抜き出したりね。

Yahoo!JAPANの左側にある方にカテゴリっぽい文字列を試しに取り出してみよう。

from selenium import webdriver

driver = webdriver.Chrome('C:/Users/rooibos-tea/Downloads/chromedriver.exe')
driver.get("https://www.yahoo.co.jp/")
elements = driver.find_elements_by_class_name('_2bBRLhI5ZpVYu0tuHZEFrn')
for element in elements:
    print(element.text)

これを実行してみるとちゃんと取れていますね。

使う関数さえわかってしまえば要素を指定して値の取得は簡単に行えそうです。要素を見つけるから何か使えるものがないのか確認しておくといいでしょう。

クリックする

クリックはclick()っていう関数があるので、要素を見つけてclick()すればOK。試しにこのサイトのトップページからリンクをクリックしてみよう。

新着記事の3番目の記事なんだけど、そこを指定してクリックすればいい。

from selenium import webdriver

driver = webdriver.Chrome('C:/Users/rooibos-tea/Downloads/chromedriver.exe')
driver.get("https://gadgelaun.com/")
elements = driver.find_elements_by_class_name('post-title')
elements[2].click()

find_elements_by_class_nameで複数の要素が取れるからその中から欲しいものを指定してclickしたという感じだ。要素を見つけてやってクリックすればいいから結構簡単ですね。

入力する

入力はsend_keys("入力したい文言")っていう関数があるからそれを使えばいける。Yahoo!JAPANのサイトにアクセスして検索バーに何か入力して、検索するっていうことをやってみよう。検索文言は「ガジェラン」しとく。

from selenium import webdriver

driver = webdriver.Chrome('C:/Users/rooibos-tea/Downloads/chromedriver.exe')
driver.get("https://www.yahoo.co.jp/")
# 検索バーを取得
search_bar = driver.find_element_by_class_name('_1wsoZ5fswvzAoNYvIJgrU4')
# 入力
search_bar.send_keys("ガジェラン")
# 検索ボタンを取得
search_button = driver.find_element_by_class_name('_63Ie6douiF2dG_ihlFTen')
# 検索ボタンをクリック
search_button.click()

これを実行するとこんな感じになりました。

良い感じに検索されていますね。検索も自動化できるというわけだ。

PythonとSeleniumでブラウザ操作を自動化する

使い方は何となく分かったから、せっかくだし何かもうちょっとやってみたいところですよね。パッと便利そうなブラウザ操作思いつかないんだけど、まあちょっと試してみよう。

Youtubeで検索して動画を表示させる

Youtubeで動画をよく流しながら作業することがあるんだけど、もうそれ最初から検索するんじゃなくて再生画面表示させておけばいいんじゃないか?っていうところありますよね。YoutubeでChillい曲を流したいからChillって検索したら一番上に出てくるやつ再生しよう。

from selenium import webdriver

driver = webdriver.Chrome('C:/Users/rooibos-tea/Downloads/chromedriver.exe')
driver.get("https://www.youtube.com/")
search_bar = driver.find_element_by_id('search')
search_bar.send_keys("Chill")
driver.find_element_by_id('search-icon-legacy').click()
driver.find_element_by_id('video-title').click()

実行するとこうだ。

まあちょっと広告が出てしまっているけど、ちゃんと動画のリンクをクリックして表示してくれていますね(あんまりクリックしている要素のあっている自信はないけど)。後はファイルを実行するシェルスクリプトでも作っておいてクリックするだけで実行!みたいなことをすればすぐにChillい音楽を聴くことができる。

Yahoo!ニュースの記事を開いて表示する

ニュースもやはり見たほうがいいですよね。Yahoo!ニュースから記事をピックアップしてそれぞれ別タブで開いて表示してやりたい。カテゴリは経済にしてそこから5件表示して表示するっていうのをやる。

from selenium import webdriver

driver = webdriver.Chrome('C:/Users/rooibos-tea/Downloads/chromedriver.exe')
driver.get("https://news.yahoo.co.jp/ranking/access/news/business")
elements = driver.find_elements_by_class_name('newsFeed_item_link')
for i in range(5):
  url = elements[i].get_attribute('href')
  driver.execute_script("window.open(arguments[0], '_blank')", url)

やっていることはYahoo!ニュースの経済カテゴリにアクセスしてニュースのリンクを取得、それらを別タブで5件開いていくっていうやつ。

 

見るべきニュースサイトが決まっているなら、すぐに見ることができるからいいかもしれない。Youtubeもそうだけど、サイトアクセスするとついうろうろしてしまうからうろうろ防止にもいいかもしれない。

まとめ

今回はPythonとSeleniumを使ってブラウザ操作を自動化するっていうことをやってみたけど、Seleniumは割と簡単に使えそうですね。凝ったことをするときには結構大変かもしれないけど。Pythonでいろいろブラウザの自動化をやりたい!っていう時には使ってみるといいかもしれない。

SleniumにはSeleniumIDEっていうのもあって、そっちはChromeの拡張機能として使うことができるからコード書くの面倒だわ・・・っていう場合には使ってみるといいですよ。こっちの記事の中で紹介しています。

それとわざわざコード書く必要もないんじゃないか?っていうものは結構Chromeの拡張機能でできちゃいそうなところもあるね。ただコード書けば、いろんな操作を自分好みに行うことができるのがやはり素晴らしい。拡張機能だと「なんかうまくいかねえ・・使いづらい・・・」みたいなこともありますからね。

自動化したい操作があったらPythonでSelenium使っていろいろやってみるといいでしょう。