読者です 読者をやめる 読者になる 読者になる

AmazonLinux(EC2) + Selenium + Ruby でスクレイピング

Ruby AWS

Seleniumを使ってAmazonLinux上でスクレイピングをやってみたときのメモ.
nokogiri単体とかだとJavascriptで動的にHTMLが書き換わるようなサイトのスクレイピングはできませんが,SeleniumというWebブラウザ操作の自動化ツールを使えばそのようなスクレイピングも可能になります.
今回は,Xvfbを使ってAmazonLinuxのCUI環境でFirefoxを動かしてスクレイピングしてみます. プログラムにはRubyを使用しますがインストールは割愛. (Seleniumスクレイピングツールというわけではないので,ブラウザテストなどにも使用可能)

使うもの

Firefoxselenium-webdriberの組み合わせは最近のものだと上手く動作しなかったので,少し古いものを使用しています.

AmazonLinux(Amazon Linux AMI release 2016.09)
Firefox(45.3.0)
Ruby(2.2.4)
selenium-webdriver(2.53.4)
Xvfb(1.15.0)


Firefox 準備

まずはAmazonLinux上でFirefoxを動かすためのパッケージを準備します.

curl -X GET -o RPM-GPG-KEY-lambda-epll https://lambda-linux.io/RPM-GPG-KEY-lambda-epll  
sudo rpm --import RPM-GPG-KEY-lambda-epll  
curl -X GET -o epll-release-2016.09-1.2.ll1.noarch.rpm https://lambda-linux.io/epll-release-2016.09-1.2.ll1.noarch.rpm  
sudo yum -y install epll-release-2016.09-1.2.ll1.noarch.rpm
sudo yum --enablerepo=epll install firefox-compat


次にブラウザを準備します.

wget -O firefox-esr.tar.bz2 "https://download.mozilla.org/?product=firefox-45.3.0esr-SSL&os=linux64&lang=en-US"
bzcat firefox-esr.tar.bz2 | tar xvf -
mv firefox /usr/local/   #適当に/usr/localとかに移動


Xvfb 準備

Xvfbは仮想ディスプレイを作成するためのソフトで,これを使えばGUI環境が無くてもGUIが必要なソフトを動かせます.(ヘッドレス)
今回はGUI環境のないAmazonLinuxを使うので,Xvfbを利用してGUI無しでFirefoxを動作させます.

yum -y install xorg-x11-server-Xvfb # インストール
export DISPLAY=:99  # ディスプレイ番号の設定
Xvfb :99 -screen 0 1024x768x24 &  # バッググラウンドで起動
  
jobs  # これでステータスを確認可能. 停止にはkillコマンドを使用


Seleniumの準備

Selenium WebDriver というクライアントライブラリを用意します.
Rubyではgemで提供されています.

gem install selenium-webdriver -v 2.53.4
gem install nokogiri  # スクレイピングライブラリもインストールしておきます


プログラムの準備

スクレイピングプログラムを書いて終わりです.

require 'nokogiri'
require 'selenium-webdriver'

Selenium::WebDriver::Firefox::Binary.path = '/usr/local/firefox/firefox' # Firefoxを配置した場所を指定

driver = Selenium::WebDriver.for :firefox # :firefoxを指定
driver.navigate.to "スクレイピングしたいサイトのURLを指定"
html = Nokogiri::HTML(driver.page_source) # nokogiriと連携して解析可能
puts html
driver.quit # ドライバを閉じる


おわり

あとはシェルスクリプトでも書いてcronで動かせば,定期的にデータを収集できます.