BLOGTIMES
2018/05/26

Windows 10 上の Ubuntu 16.04 に Splash をインストールする

  wsl  python  ubuntu  splash  tutorial 
このエントリーをはてなブックマークに追加

Splash 3.2 - Windows 10 上の Ubuntu 16.04 に Splash をインストールする

HTML 内の JS をレンダリングしてくれるサーバである Splash を WSL(Windows Subsystem for Linux) な Ubuntu 16.04 にマニュアルでインストールしようとしたら、いろいろハマってしまったのでその顛末をメモとして残しておきます。Splash を使うと JavaScript が埋まった HTML をスクレイピングしたいときや、ウェブページのサムネイル生成などが簡単にできます。

公式のマニュアルはあるけれど・・・

Ubuntu 16.04 向けのインストールマニュアルは以下にあります。

これですんなりインストールできるのかなと思っていましたが、これを WSL の Ubuntu 16.04 でやると、手順2の「sudo ./provision.sh ・・・」というところで以下のようなエラーを吐いてハングしてしまいます。

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' process 17451: D-Bus library appears to be incorrectly set up; failed to read machine uuid: UUID file '/etc/machine-id' should contain a hex string of length 32, not length 0, with no other text See the manual page for dbus-uuidgen to correct this issue. [240] Critical: QList<KDUpdater::VolumeInfo> KDUpdater::mountedVolumes(): Cannot open /etc/mtab: No such file or directory [240] Critical: QList<KDUpdater::VolumeInfo> KDUpdater::mountedVolumes(): Cannot open /etc/mtab: No such file or directory

ネット上の情報を探してみると、ヘッドレスで Qt5 をインストールしようとするとハングするという情報もあり、これと同じ問題のような気がするので、上記で出ている細かいエラーと共にこちらにも対処することにします。

ヘッドレスな状況では画面が見えず、有効な対策が打てないので今回は xvfb ではなく、VcXsrv を使って画面を見ながら臨機応変に対応することにしました。

以下、具体的なインストール手順。

下準備

あらかじめ VcXsrv をインストールし、起動しておきます。
さらに、Ubuntu 16.04 を最新状態にして、エラーが出ているファイル(/etc/mtab, /etc/machine-id)を生成します。
dbus は使っているかどうかイマイチ確信が持てませんが、一応サービスを起動しておきます。

sudo apt-get update ; sudo apt-get -y upgrade; sudo apt-get -y install build-essential git sudo ln -s /proc/mounts /etc/mtab sudo mv /etc/machine-id{,.bak} sudo dbus-uuidgen --ensure=/etc/machine-id sudo service dbus start

Splash のインストール

ここからは公式のマニュアルに沿って進行しますが、適宜パッチを当てます。

1.Clone the repo from GitHub:

この部分はオリジナルから変更はありません。単に git のリポジトリをクローンするだけです。

cd ~ git clone https://github.com/scrapinghub/splash/

2. Install dependencies:

ここではインストール用のメインスクリプトである provision.sh にパッチを当てています。
パッチの内容は大きく以下の2点です。

  • Qt のインストーラーを vxvb ではなく、VcXsrv 経由で起動するように修正
  • qmake のパスがうまく解決されていないのを修正
cd splash/dockerfiles/splash sudo cp ./qt-installer-noninteractive.qs /tmp/script.qs patch -p3 <<'EOF' --- a/dockerfiles/splash/provision.sh +++ b/dockerfiles/splash/provision.sh @@ -124,7 +124,7 @@ install_official_qt () { curl -L -o /downloads/qt-installer.run \ http://download.qt.io/official_releases/qt/5.9/5.9.1/qt-opensource-linux-x64-5.9.1.run && \ chmod +x /downloads/qt-installer.run && \ - xvfb-run /downloads/qt-installer.run \ + DISPLAY=localhost:0.0 /downloads/qt-installer.run \ --script /tmp/script.qs \ | egrep -v '\[[0-9]+\] Warning: (Unsupported screen format)|((QPainter|QWidget))' && \ ls /opt/qt59/ && \ @@ -139,7 +139,7 @@ install_qtwebkit () { curl -L -o /downloads/qtwebkit.tar.xz https://github.com/annulen/webkit/releases/download/qtwebkit-5.212.0-alpha2/qtwebkit-5.212.0_alpha2-qt59-linux-x64.tar.xz && \ pushd /builds && \ tar xvfJ /downloads/qtwebkit.tar.xz --keep-newer-files && \ - rsync -aP /builds/qtwebkit-5.212.0_alpha2-qt59-linux-x64/* `qmake -query QT_INSTALL_PREFIX` + rsync -aP /builds/qtwebkit-5.212.0_alpha2-qt59-linux-x64/* `/opt/qt59/5.9.1/gcc_64/bin/qmake -query QT_INSTALL_PREFIX` } @@ -164,8 +164,8 @@ install_pyqt5 () { # PyQt5 tar xzf /downloads/pyqt5.tar.gz --keep-newer-files && \ pushd PyQt5_gpl-${SPLASH_PYQT_VERSION} && \ -# --qmake "${SPLASH_QT_PATH}/bin/qmake" \ ${_PYTHON} configure.py -c \ + --qmake "/opt/qt59/5.9.1/gcc_64/bin/qmake" \ --verbose \ --confirm-license \ --no-designer-plugin \ EOF sudo ./provision.sh \ prepare_install \ install_msfonts \ install_extra_fonts \ install_deps \ install_flash \ install_qtwebkit_deps \ install_official_qt \ install_qtwebkit \ install_pyqt5 \ install_python_deps echo "/opt/qt59/5.9.1/gcc_64/lib/" | sudo tee /etc/ld.so.conf.d/qt59.conf > /dev/null sudo ldconfig

オリジナル版ではヘッドレスなので Qt のインストール画面は出ないようになっていますが、今回はちゃんとした X Server を使うので以下のようなインストーラーの画面が表示(操作自体はスクリプトを指定しているので自動)されます。
Qt 5.9.1 インストーラー - Windows 10 上の Ubuntu 16.04 に Splash をインストールする
この工程のどこかで引っかかるのかと思っていましたが、ハングすることもなくなぜかすんなり完了してしまいました。
詳細はよく分かりませんが、vxfb と Qt のインストーラーの相性が良くないということなのかもしれません。

最後に pip3 で splash をインストールします。dbus はいちおうここで止めておきます。

cd sudo pip3 install splash/ sudo service dbus stop

これでインストールは完了です。

Splash を起動してみる

きちんとインストールできていれば、以下のコマンドで Splash サーバが起動します。

python3 -m splash.server

Splash のデフォルトポートは 8050 なので、ブラウザで http://localhost:8050 にアクセスすれば Splash の画面が表示されるはずです。あとは URL 欄に好きな URL を入力して「Render ! 」をクリックすればサイトのサムネイルが生成されるはずです。

一つ一つは小さなことですが、ここまで来るまでいろいろ試行錯誤があって大変でした。

2018/6/22 追記

ld から libQt5Quick.so.5 が見つからないと以下のように怒られる場合があるようなので、/etc/ld.so.conf.d にパスを追加する手順を追加しました。

ImportError: libQt5Quick.so.5: cannot open shared object file: No such file or directory

18.04 に対してインストールを行う場合には以下の手順を使ってください。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/10200
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    にぽぽ (2018/06/15 18:17)

    python3 -m splash.server

    Traceback (most recent call last):
    File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main
    "__main__", mod_spec)
    File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
    File "/usr/local/lib/python3.5/dist-packages/splash/server.py", line 11, in <module>
    from splash.qtutils import init_qt_app
    File "/usr/local/lib/python3.5/dist-packages/splash/qtutils.py", line 15, in <module>
    from PyQt5.QtWebKit import QWebSettings
    ImportError: No module named 'PyQt5.QtWebKit'

    上と全く同じようにしているのですが、
    ここでエラーが出る理由を教えていただけると非常に助かります。

    Comments Form

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン