Ruby

【selenium-webdriver】chromedriverを使ってブラウザ自動操作!Rubyプログラムでスクレイピング(selenium-webdriver,nokogiriを使用)

selenium
対象者

本記事は「プログラミング初心者」を対象にしています。

<h2>Seleniumを使ってスクレイピングしてみよう</h2>

キヨシ
キヨシ
フォッフォッフォッ、キヨシ(<a href=”https://twitter.com/kiyothink12″>@kiyothink12</a>)じゃ^^ 今日はSeleniumを使ってRubyプログラムでスクレイピングをしてみようと思うよ。
ケイタ
ケイタ
せれにうむ??
キヨシ
キヨシ
うむ、前回はURLを直指定してopen-uriを使ってアクセスしていたが、今回はSelenium Webdriverを使ってブラウザを自動操作して対象ページを取得するぞい^^
ケイタ
ケイタ
ん〜まだ今のところいまいちよくわからないけど、とりあえずやってみたいと思います!

selenium-webdriver環境構築

<環境>

Mac OS X: 10.13.6

ruby: 2.2.2

nokogiri: 1.8.4

selenium-webdriver 3.14.1

Homebrew 1.7.6

※Google Chrome 68(versionが59未満の場合は後に説明するヘッドレスモードが機能しないのでバージョンアップしてください。

Homebrew(macOS用パッケージマネージャー)をインストール

まずはHomebrewをインストールしてみましょう。
Homebrewは様々な便利なソフトウェアをサクッとインストールするのを手伝ってくれる便利なものじゃ(厳密に言うとmacOS用パッケージマネージャーと言います。)

ターミナルを開いて下記コマンドを打ってHomebrewをインストール

$ /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

 

brew doctorコマンドを打ってみる。下記のように出力されたらOK。

$ brew doctor
Your system is ready to brew.

 

chromedriverをインストール

chromedriverをインストールする

$brew cask install chromedriver

==> Satisfying dependencies
==> Downloading https://chromedriver.storage.googleapis.com/2.42/chromedriver_mac64.zip
==> Verifying SHA-256 checksum for Cask ‘chromedriver’.
==> Uninstalling Cask chromedriver
==> Purging files for version 2.42 of Cask chromedriver
==> Installing Cask chromedriver
==> Linking Binary ‘chromedriver’ to ‘/usr/local/bin/chromedriver’.
chromedriver was successfully installed!


/usr/local/bin/chromedriverの場所にchromedriverがインストールされたようです。
念のため確認してみましょう。

$ ll /usr/local/bin/chromedriver

/usr/local/bin/chromedriver -> /usr/local/Caskroom/chromedriver/2.42/chromedriver

無事chromedriverのver2.42が入っているようですね。

参考:Homebrew公式ドキュメント

selenium-webdriverなどの必要gemをインストール

selenium-webdriverのgemをインストール。

$ gem install selenium-webdriver

 

<※nokogiriのgemをまだインストールしていない人>
nokogiriのgemをインストール。

$ gem install selenium-webdriver

 

selenium-webdriverをchromeブラウザで動かすコードを書いてみよう

さて、これでようやく準備が整いました。
ここからコードを書いていきましょう。

chromedriverを起動させて、指定のwebページにアクセスしスクレイピングをしていきましょう。

下記コードで動かしていきます。yahooのリアルタイムのトップニュースを取得して出力してみましょう。

①requireでnokogiri,selenium-webdriverを読み込みます。

②訪れるページ(今回はyahooトップページ)を指定して変数urlに格納。

③Webドライバーのオプションを設定します。—headlessを設定するとブラウザが出現しません。(後ほどコメントアウトして試してみましょう。)

④chromedriverを起動し、セッションとして変数に格納します。

⑤指定のURLへアクセスし、nokogiriを使って遷移先のページのHTMLをパース(解析)しnokogiriドキュメントにします。

⑥yahooトップページのトップニュースを上から順に1行ずつ取得し出力します。

ではここで3で述べたように

options.add_argument(‘–headless’)

の行を以下のようにコメントアウトしてもう一度実行してみましょう。

#options.add_argument(‘–headless’)

chromedriverが画面上に出現しませんでしたが(ヘッドレスモードと言います)、ターミナルでは同様の文字列が出力されましたでしょうか?

まずは出現するchromeの画面上でコードに書いたことが期待通り動いているかどうかを確認し、期待通りに動いていることを確認できてからヘッドレスモードにすると良いと思います。

ケイタ
ケイタ
うわーすごい!こんなことが出来るんですね!
キヨシ
キヨシ
うむ、実際に手動でブラウザを操作しているようにボタンクリックやテキスト入力も出来るからselenium webdriverはとても便利に使えるぞい^^
ケイタ
ケイタ
え!そんなことも出来るんですね!どうやるんですか!?
キヨシ
キヨシ
よし、それではやってみよう

それでは先ほどのコードの下に続いてコーディングしていきましょう。

①chromeの検証ツールを使ってyahooの検索窓のidを取得し、変数search_barに格納します。

②検索窓に検索キーワード‘selenium ruby’を打ちます。

③検索ボタンをクリック(こちらも検証ツールで検索ボタンのcssセレクタを確認)

④ページ遷移後、nokogiriで現在のページのhtmlをパースします。page_sourceメソッドで現ページのソースを取得しています。

⑤遷移したページのnokogiriドキュメントから検索順位の上からページタイトル、ページURLを各々取得して出力していきます。

キヨシ
キヨシ
という感じじゃな。どうじゃ?すごく便利そうだしプログラミングの可能性を感じさせるじゃろ?
ケイタ
ケイタ
はい!こういう動きってまさに”プログラミングしてる”って感じでとてもワクワクします!
キヨシ
キヨシ
うむ、余談じゃがヘッドレスモードにしている時は下記コードを書いたところはスクリーンショットも撮れて、今ブラウザがどこのページを見ているのかがわかるんじゃ

※下記ではカレントディレクトリからの相対パスで保存場所を指定し、screenshot.pngというファイル名で保存されます。

@session.save_screenshot ‘./screenshot.png’

 

ケイタ
ケイタ
いろんなメソッドがあるんですね!
キヨシ
キヨシ
こちらの方のサイトにコードのチートシートが見やすく色々書かれているから参考にしてみると良いぞい^^

参考:Seleniumチートシート [Ruby]

※スクレイピングが初めての人はopen-uriを使った下記記事もぜひ読んで参考にしてみてくださいね^^

scraping_icatch
【スクレイピング】RubyでWebサイトからテキスト文字を抜き取るやり方(open-uri、nokogiriを使用) スクレイピングとは? スクレイピング環境構築 環  境 Mac OS X: 10.13.6 ru...
ABOUT ME
キヨシ
キヨシ
キヨシじゃよ^^ 30歳を超えてからエンジニアに転身。現在はリモートワークしながら海外と日本を行き来して自由気ままに暮らしておるよ( ^ω^ ) フォッフォッフォッ