Selenium+ChromeDriverでスクレイピングをしてみる

はじめに

Nokogiriについて学ぶ \- らせんびよりで、Nokogiriでは情報の取得が難しいサイトがあることを学んだ。

今回は、そういったサイトにも対応できる「Selenium+ChromeDriverでスクレイピングをする方法」について学んでいく。

SeleniumとChromeDriverについて

この二つを組み合わせることで、プログラム上で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には要素の取得方法が色々と用意されている。

試しにCSSセレクターを使って要素の取得を試みる。

対象は、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を作っていく予定。