Selenium+ChromeDriverでスクレイピングをしてみる
はじめに
Nokogiriについて学ぶ \- らせんびよりで、Nokogiriでは情報の取得が難しいサイトがあることを学んだ。
今回は、そういったサイトにも対応できる「Selenium+ChromeDriverでスクレイピングをする方法」について学んでいく。
SeleniumとChromeDriverについて
- Selenium
- Webブラウザで行うクリック操作やキーボード入力などをプログラム上から操作できるようにするライブラリ
- rubyではselenium-webdriver gemを使うことで使用可能
- Seleniumチートシート \[Ruby\] \| 酒と涙とRubyとRailsと
- ChomeDriver
この二つを組み合わせることで、プログラム上でchromeブラウザを操作することができるようになる。
ためしにseleniumをrubyでやってみたを参考にやってみる。
# selenium-webdriverを取り込む
require 'selenium-webdriver'
require 'webdrivers'
# ブラウザの指定(Chrome)
session = Selenium::WebDriver.for :chrome
# 10秒待っても読み込まれない場合は、エラーが発生する
session.manage.timeouts.implicit_wait = 10
# ページ遷移する
session.navigate.to "<https://google.com/>"
# ページのタイトルを出力する
puts session.title
# 検索フォームの取得(この場合はname属性で取得している)
query = session.find_element(:name, 'q')
# "zenn"を自動入力する
query.send_keys('zenn')
# 送信(検索)
query.submit
# 5秒遅延(処理が早すぎてページ遷移前にスクリーンショットされてしまうため)
sleep(5)
# スクリーンショットをして"zenn.png"で保存する(保存される場所は、コード実行箇所)
if session.save_screenshot('zenn.png')
# スクリーンショットができたら出力する
puts "スクリーンショットされました!"
end
# ブラウザを終了
session.quit
とすると、
$ ruby selenium_test.rb
Google
スクリーンショットされました!
無事動作したようだ。
Selenium+ChromeDriverでのスクレイピング方法
selenium公式のドキュメントFinding web elements \| Seleniumによると、seleniumには要素の取得方法が色々と用意されている。
対象は、nokogiri gemでは取得が難しかった発売スケジュール|任天堂
# selenium-webdriverを取り込む
require 'selenium-webdriver'
require 'webdrivers'
# ブラウザの指定(Chrome)
session = Selenium::WebDriver.for :chrome
# 10秒待っても読み込まれない場合は、エラーが発生する
session.manage.timeouts.implicit_wait = 10
# ページ遷移する
session.navigate.to "<https://www.nintendo.co.jp/schedule/index.html>"
# ページのタイトルを出力する
puts session.title
# 発売予定のゲームタイトルを取得
el = session.find_elements(:css, 'div.local-schedule__listTitle > strong')
el.each do |title|
puts title.text
end
# ブラウザを終了
session.quit
とすると…
$ ruby selenium_test.rb
発売スケジュール|任天堂
孤独なヴィラ (Lonesome Village)
Missile Command: Recharged
Adrian's Tale
AAAクロック 2
Shatter Remastered Deluxe
すみっコぐらし みんなでリズムパーティ
Timore 5
ドラえもん のび太の牧場物語 大自然の王国とみんなの家
ドラえもん のび太の牧場物語 大自然の王国とみんなの家 デラックスエディション
ドラゴンプラナ
ピクセルぬりえ
Flying Neko Delivery
Mecha Ritz: Steel Rondo
ラン・ボックス・ラン
A列車で行こう ひろがる観光ライン
Aeterna Noctis
Ghost Song
Nintendo Switch(有機ELモデル) スカーレット・バイオレットエディション
HARVESTELLA
It Takes Two
ソニックフロンティア
ソニックフロンティア デジタルデラックス
Sifu
アイ★チュウ
アドベントカレンダー
お絵かき心理テスト ー恋愛も友情も!かんたん診断でアナタの脳内マルハダカ!?-
Orbital Bullet
Cyber Velocity Run
Jurassic World Aftermath Collection
...
発売予定のゲームタイトルを取得することができた!
感想
やっと望みの結果が得られて嬉しい。
最初nokogiriでいくらやってもうまくいかなかったので、「もしかしてスクレイピング対策されてるのかなあ…」と思ったが、やりようはあるものだなあ。
今回の結果を元にrubygemを作っていく予定。