PHPでSeleniumWebdriverを操作してヘッドレス化したChromeを動かす
ajaxでコンテンツを生成しているページをスクレイピングしようと思ったので、WebDriverを試してみました。本来の用途(E2Eテスト)とは少し違うとは思いますが、使えるものは使う方向で。
gccのビルドとかで長くなったので、ajaxコンテンツを取得するとか本当にやりたかったところまでは書いてません。とりあえず動くところまでです。
いろいろ準備
SeleniumServer(Standalone版)のダウンロード
$ wget http://selenium-release.storage.googleapis.com/2.48/selenium-server-standalone-2.48.2.jar
JDK, Xvfb, Firefoxのインストール
$ sudo yum install -y java-1.8.0-openjdk $ sudo yum install -y xorg-x11-server-Xvfb firefox
Chromeインストール
ChromeはCentOS向けに提供されていない?っぽいのでリチャードさんのスクリプトでインストールする
# wget http://chrome.richardlloyd.org.uk/install_chrome.sh # chmod u+x install_chrome.sh # ./install_chrome.sh
ChromeDriverのダウンロード
WebDriverからChromeを操作するためのドライバをダウンロードする
$ wget http://chromedriver.storage.googleapis.com/2.20/chromedriver_linux64.zip $ unzip chromedriver_linux64.zip
日本語関連のパッケージをインストール
デフォルトだと文字化けしてしまうので。
$ sudo yum -y groupinstall "Japanese Support"
環境変数DISPLAYの設定
$ vi ~/.bash_profile export DISPLAY=:3 $ source ~/.bash_profile
Xvfb起動
$ Xvfb :3 -screen 0 1024x768x24 &
SeleniumServer起動
$ java -jar selenium-server-standalone-2.48.2.jar
試してみる
ようやく準備が整ったので、実際に動かしてみる。とりあえずページのタイトルを取得させて動くか確認。
<?php require_once 'vendor/autoload.php'; putenv("webdriver.chrome.driver=/hogehoge/chromedriver"); use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\Remote\RemoteWebDriver; $host = 'http://localhost:4444/wd/hub'; $driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome(), 5000); $url = 'https://qiita.com/'; $driver->get($url); echo $driver->getTitle() . "\n";
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /hogehoge/chromedriver)
動かない。ChromeDriverが要求してるバージョンGLIBCXX_3.4.15
がないらしい。
GLIBCXX_3.4.15
入りのlibstdc++.so.6
を手に入れる
$ ls -la /usr/lib64/ | grep libstdc 708:lrwxrwxrwx 1 root root 19 2015-10-15 18:31 libstdc++.so.6 -> libstdc++.so.6.0.13 709:-rwxr-xr-x 1 root root 987096 2015-07-23 10:03 libstdc++.so.6.0.13
libstdc++.so.6
はlibstdc++.so.6.0.13
のシンボリックリンクだったので、中身をみてみる。
$ strings /usr/lib64/libstdc++.so.6.0.13 | grep GLIBCXX 3658:GLIBCXX_3.4 3659:GLIBCXX_3.4.1 3660:GLIBCXX_3.4.2 3661:GLIBCXX_3.4.3 3662:GLIBCXX_3.4.4 3663:GLIBCXX_3.4.5 3664:GLIBCXX_3.4.6 3665:GLIBCXX_3.4.7 3666:GLIBCXX_3.4.8 3667:GLIBCXX_3.4.9 3668:GLIBCXX_3.4.10 3669:GLIBCXX_3.4.11 3670:GLIBCXX_3.4.12 3671:GLIBCXX_3.4.13 8088:GLIBCXX_FORCE_NEW 8151:GLIBCXX_DEBUG_MESSAGE_LENGTH
たしかにGLIBCXX_3.4.15が無い。 新しいgccをビルドすれば入手できるらしいので、現行と同じメジャーバージョンでマイナーバージョンが偶数のgccをビルドする。
$ gcc -v gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) // GMP $ wget http://ftp.gnu.org/gnu/gmp/gmp-6.1.0.tar.bz2 $ tar jxf gmp-6.1.0.tar.bz2 // MPC $ wget http://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz $ tar zxf mpc-1.0.3.tar.gz // MPFR $ wget http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.3.tar.bz2 $ tar jxf mpfr-3.1.3.tar.bz2 // GCC $ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.5/gcc-4.8.5.tar.gz $ tar zxvf gcc-4.8.5.tar.gz $ cd gcc-4.8.5 $ ln -s ../gmp-6.1.0 gmp $ ln -s ../mpc-1.0.3 mpc $ ln -s ../mpfr-3.1.3 mpfr $ ./configure --disable-bootstrap --build=x86_64-linux-gnu --disable-multilib $ make
$ strings x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 | grep GLIBCXX 3769:GLIBCXX_3.4 3770:GLIBCXX_3.4.1 3771:GLIBCXX_3.4.2 3772:GLIBCXX_3.4.3 3773:GLIBCXX_3.4.4 3774:GLIBCXX_3.4.5 3775:GLIBCXX_3.4.6 3776:GLIBCXX_3.4.7 3777:GLIBCXX_3.4.8 3778:GLIBCXX_3.4.9 3779:GLIBCXX_3.4.10 3780:GLIBCXX_3.4.11 3781:GLIBCXX_3.4.12 3782:GLIBCXX_3.4.13 3783:GLIBCXX_3.4.14 3784:GLIBCXX_3.4.15 3785:GLIBCXX_3.4.16 3786:GLIBCXX_3.4.17 3787:GLIBCXX_3.4.18 3788:GLIBCXX_3.4.19 8176:GLIBCXX_FORCE_NEW 8396:GLIBCXX_DEBUG_MESSAGE_LENGTH
GLIBCXX_3.4.19を含むlibstdc++.soができたので、シンボリックリンクを置き換える。
$ sudo cp -a gcc-4.8.5/x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19 /usr/lib64/ # cd /usr/lib64/ # mv libstdc++.so.6 libstdc++.so.6.bak # ln -s libstdc++.so.6.0.19 libstdc++.so.6 # strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX 3769:GLIBCXX_3.4 3770:GLIBCXX_3.4.1 3771:GLIBCXX_3.4.2 3772:GLIBCXX_3.4.3 3773:GLIBCXX_3.4.4 3774:GLIBCXX_3.4.5 3775:GLIBCXX_3.4.6 3776:GLIBCXX_3.4.7 3777:GLIBCXX_3.4.8 3778:GLIBCXX_3.4.9 3779:GLIBCXX_3.4.10 3780:GLIBCXX_3.4.11 3781:GLIBCXX_3.4.12 3782:GLIBCXX_3.4.13 3783:GLIBCXX_3.4.14 3784:GLIBCXX_3.4.15 3785:GLIBCXX_3.4.16 3786:GLIBCXX_3.4.17 3787:GLIBCXX_3.4.18 3788:GLIBCXX_3.4.19 8176:GLIBCXX_FORCE_NEW 8396:GLIBCXX_DEBUG_MESSAGE_LENGTH
もう一度試してみる
XvfbとSeleniumServerを立ち上げて、上の方で作ったphpスクリプトを再度動かしてみる。
$ Xvfb :3 -screen 0 1024x768x24 & $ java -jar selenium-server-standalone-2.48.2.jar & $ php webdriver.php Qiita - プログラマの技術情報共有サービス
とれましたー。
参考: