webサイトのスクレイピングをする際に、chromedriverを常時立ち上げる必要があり設定した方法をメモしておきます。
Dockerをホスティングするサーバーは公開環境にはなくて、家のストレージ環境として使っていたSynologyでDockerが使えることに気づき、設定してみました。
常時接続といっても個人的なスクレイピングに使うだけなので、使えれば良い人向けです。
目次
Container Managerでchromedriverの立ち上げ
SynologyでDockerを立ち上げるための Container Managerを導入、 selenium/standalone-chrome
のイメージを導入してください。
導入したイメージを立ち上げて、ポート設定を行います。
この設定をすることでSynologyのIPで 4444
ポートで chromedriver を接続して使用することができます。
Webdriverでブラウザアクセスできるか確認
chromedriverが起動しているか確認します。
PHPによる Selenium/WebDriver 実装のライブラリを使用してwikipediaのリンク名を取得するサンプルを動かしてみます。
mkdir webdriver
cd webdriver
composer require php-webdriver/webdriver
touch index.php
<?php
require 'vendor/autoload.php';
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriver;
use Facebook\WebDriver\WebDriverBy;
$serverUrl = 'http://<synologyで設定したホスト名など>.local:4444';
$driver = RemoteWebDriver::create($serverUrl, DesiredCapabilities::chrome());
$driver->get('https://ja.wikipedia.org/wiki/Selenium_(software)');
// Find search element by its id, write 'PHP' inside and submit
$driver->findElement(WebDriverBy::id('searchInput')) // find search input element
->sendKeys('PHP') // fill the search box
->submit(); // submit the whole form
// Find element of 'History' item in menu by its css selector
$historyButton = $driver->findElement(
WebDriverBy::cssSelector('#ca-history a')
);
// Read text of the element and print it to output
echo 'About to click to a button with text: ' . $historyButton->getText();
// Click the element to navigate to revision history page
$historyButton->click();
// Make sure to always call quit() at the end to terminate the browser session
$driver->quit();
synologyでは固定IPで設定したり、ホスト名でアクセスできるように設定してあればそちらの値を設定してsynologyを見に行けるように変更してください。
後述するDDNSの設定をしてあれば、そのホスト名でもOKです。ローカルネットワークから実行すると外部ネットワークは経由せずにルーターで完結してみてくれるはずです。
実行結果は以下になります。wikipediaにアクセスしてPHPと検索、ヘッダーの「履歴表示」のリンク名を取得して表示してくれます。
% php index.php
About to click to a button with text: 履歴表示
外部ネットワークから接続
一般的な家庭環境のネットワークではIPアドレスは常に変わります。インターネットにアクセスするだけなら問題はないのですが、今回のように外部ネットワークからアクセスする時にはDNSの設定ができないので問題になります。
そんな時に使うのが ダイナミックDNS (DDNS) です。SynologyではこのDDNS機能がデフォルトで備わっており、画面ポチポチでDDNSを設定できます。
設定すると以下のようになるかと思います。
SynologyのDDNSは様々なドメインが使えますが、自分の場合には「〇〇.synology.me」と設定しており、このサブドメインにアクセスすることで外部ネットワークからSynologyサーバーにアクセスすることができます。
この状態からはあとはルーターのポート開放を変えるだけでアクセスできます。ルーターがUPnPに対応してるのであればポート開放もSynologyから設定できるので、以下のようにすることで開放できます。
これで外部ネットワークからDockerで立ち上げたchromedriverに接続できます。接続テストに使ったPHPファイルを外のレンタルサーバーに置いて実行してみましょう。その際にはDDNSで設定したドメインに変更します。
$serverUrl = 'http://<synologyで設定したホスト名など>.local:4444';
↓
$serverUrl = 'http://<DDNS名>:4444';
終わりに
以上、外部ネットワークからSynologyで立ち上げたDockerのchromedriverに接続する方法でした。
Dockerで公開する必要があるが、新しいサーバーを立ち上げる程でもなかったり、Synologyを保有していたりネットワーク周りで遊びたい人には打ってつけかと思います。
今回は一時的な公開だったのでポート開放してますが、常時接続するのであればセキュリティ面も考える必要があります。ポートは開放しないで、Synologyの中で完結させるのもいいかもしれません。
SynologyでWeb Stationを使う事でWebサーバーを公開することができます。HTTPSとしても使えるのでフロントとしてWeb Stationを使って表示して、バックエンドでSynology内のDockerと接続するのも良いかもしれません。
今回もお疲れ様でした。
コメントを残す