JavaScriptを使用したレンダリングをしているwebサイトのスクレイピングをする時にはseleniumやpuppeteerを使う必要があるのですが、レンタルサーバーで実行する環境が今まで作れませんでした。
今まではAWS LambdaやHerokuにpuppeteer実行環境を作成して、URLを投げればHTMLだけjsonにラップされて返却するAPIを作成していましたが、HomeBrewを入れる事によって各種パッケージのインストールが楽になったので環境構築してみました。それの記録です。
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
コメントを残す