レンタルサーバーでselenium/puppeteerを動かす

JavaScriptを使用したレンダリングをしているwebサイトのスクレイピングをする時にはseleniumやpuppeteerを使う必要があるのですが、レンタルサーバーで実行する環境が今まで作れませんでした。

今まではAWS LambdaやHerokuにpuppeteer実行環境を作成して、URLを投げればHTMLだけjsonにラップされて返却するAPIを作成していましたが、HomeBrewを入れる事によって各種パッケージのインストールが楽になったので環境構築してみました。それの記録です。

HomeBrewのインストールについはこちらを参照ください

https://rensaba-programer.jp/2022/08/07/レンタルサーバーにhomebrewを入れる/

ちなみに確認できたレンタルサーバーはXSERVER(エックスサーバー)で確認できました。SSH出来るレンタルサーバーであればインストール対象など変わるかもですが、なんとか出来そうな気もします。

Chromiumのインストール

今回の記事ではseleniumを例に環境構築していきます。普段はpuppeteer使いなのですが、PHPから実行する必要があったのでseleniumです。どっちにしろChromiumは必要なので入れていきましょう。

以下の記事を参考に入れていきます。

Chromiumの特定バージョンをダウンロードする
https://qiita.com/cognitom/items/cf00c3c79fa80ac12a4a

2022年8月15日現在、Linux向けの安定バージョンは104系なのでそれに近いビルドはこちら
https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/1012728/

seleniumであればchromedriverも一緒にダウンロードしてPATHを通しておきます。同じバージョンでないと動かないので注意してください。

$ which chrome
~/opt/bin/chrome
$ which chromedriver
~/opt/bin/chromedriver

コマンド名がchromeとなっていますが、実体はchromiumです。

Chromiumの実行に足りないsoファイルを揃える

chromiumのダウンロードはzipファイルを解凍するだけで入るのですが、共通ライブラリが揃っていないのでHomeBrewで入れていきます。

方針としては以下の流れを繰り返していきます。

  • lddで足りないsoファイルを探して
  • soファイルが入っているパッケージをyumで探して
  • HomeBrewで入れる
  • soファイルのパスを通す
  • (今回は不要)HomeBrewで無ければyumでrpmファイルからソースを取り出してビルド

XSERVER(エックスサーバー)環境に関してはHomeBrewで全てインストール出来たのでラッキーでした。

lddで足りないsoファイルを探す

$ ldd ~/opt/bin/chrome | grep not
	libatk-1.0.so.0 => not found
	libatk-bridge-2.0.so.0 => not found
	libxkbcommon.so.0 => not found
	libXcomposite.so.1 => not found
	libatspi.so.0 => not found

soファイルが入っているパッケージをyumで探す

$ yum provides libatk-1.0.so.0
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
atk-2.28.1-2.el7.i686 : Interfaces for accessibility support
リポジトリー        : base
一致          :
Provides    : libatk-1.0.so.0


上記の結果で見つかったパッケージは

atk-2.28.1-2.el7.i686

でした。

HomeBrewで入れる

上記を繰り返してパッケージを探していきます。

atk-2.28.1-2.el7.i686

であれば atk が怪しいので入れます。lddでなかったパッケージの一覧としては以下の通り

brew install atk
brew install at-spi2-core
brew install at-spi2-atk
brew install libxkbcommon
brew install libXcomposite

soファイルのパスを通す

cd $HOME/opt/lib64

ln -s $HOME/.linuxbrew/lib/libatk-1.0.so.0 .
ln -s $HOME/.linuxbrew/lib/libatk-bridge-2.0.so.0 .
ln -s $HOME/.linuxbrew/lib/libxkbcommon.so.0 .
ln -s $HOME/.linuxbrew/lib/libXcomposite.so.1 .
ln -s $HOME/.linuxbrew/lib/libatspi.so.0 .

上記の実行後、.bashrc などに以下の環境変数を設定してください。

export LD_LIBRARY_PATH=$HOME/opt/lib:$HOME/opt/lib64:$LD_LIBRARY_PATH

上記を設定すると yum コマンドが実行できなくなりますが、実行する際には適時コメントアウトして .bashrc の再読み込みをしてください。

lddを実行してsoファイルが読み込まれているかを確認。何も出力されなければOKです。

$ ldd ~/opt/bin/chrome | grep not

実際に使ってみる

上記の手順で実行できる環境の構築はできたので、seleniumで実行できるか確認します。

こちらの記事を参考に、CUIだけの環境のためヘッドレスモードで起動するように以下のコードに書き換えます。
https://qiita.com/kurodariuto/items/e6feecea803178fecd8f

<?php

require_once __DIR__ . '/vendor/autoload.php';
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Chrome\ChromeDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;

$driverPath = realpath('/home/<ユーザー名>/opt/bin/chromedriver');
putenv('webdriver.chrome.driver=' . $driverPath);

$options = new ChromeOptions();
$options->addArguments(['--no-sandbox', '--headless', '--disable-dev-shm-usage', '--disable-setuid-sandbox']);

$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);

$driver = ChromeDriver::start($caps);

// Googleへ遷移
$driver->get('https://www.google.co.jp/');

// 5秒待機
$driver->wait(5);

// スクリーンショット
$file = './sample.png';
$driver->takeScreenshot($file);

// ブラウザを閉じる
$driver->quit();

以下のような画像が作成されば成功です。日本語も正常に表示されているのでフォントのダウンロードなどは不要そうでした。

終わりに

レンタルサーバーにselenium/puppetter環境を構築する方法でした。今回はXSERVER(エックスサーバー)に設定しましたが、SSH出来ればどこでも出来るようにも思えます。

root持ってないユーザーでやりくりするとLinuxスキルが上がっていく気がします。lddコマンドとか知らなかったですが、基礎の部分を調べる機会なんて普段ないので良い勉強になりました。

参考リンク

https://qiita.com/kurodariuto/items/e6feecea803178fecd8f

https://qiita.com/cognitom/items/cf00c3c79fa80ac12a4a

https://www.wakuwakubank.com/posts/395-linux-ldd-ldconfig/

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA