waste of time

主にPHP

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インストール

ChromeCentOS向けに提供されていない?っぽいのでリチャードさんのスクリプトでインストールする

# 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.6libstdc++.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 - プログラマの技術情報共有サービス

とれましたー。

参考: