DXを実践するためにphp-webdriver selenium webdriverでクローリング等を行っているのですが
どうもページの読み込みに詰まることがあって、応答がなくタイムアウトしてしまうことが多々あり
調べてみると画像ファイル取得でどうもなかなか応答がないっぽい。
こちら側の問題なのか先方のWebサーバの問題かわからず途方に暮れてた時、
別に画面スクショ取るわけではないので
画像取得は無視できたらいろいろ捗るなぁ・・と思いついて調べた次第。
HeadlessはChromeをつかっているけど、さくっとググっても見つからず
たどり着いたのは公式のwiki。
https://github.com/php-webdriver/php-webdriver/wiki/Chrome
まあ灯台もとぐらしってやつですな。
(github wikiってgoogle検索では引っかからない。あのUIでは多分クローラーが辿れないよね)
use Facebook\WebDriver\Chrome\ChromeDevToolsDriver;
と
new ChromeDevToolsDriver()
と
execute('Network.setBlockedURLs',["urls"=> [array])
で実現できた。
(個人的にはレベルクズなエンジニアなので、何をuseすればいいのかがいつもわからない・・)
RemoteWebDriverで対応してるのでlocalではこの方法ではないっぽいけど
てめーのしたいことはこれで十分なので
あと
use Facebook\WebDriver\Chrome\ChromeDevToolsDriver;
をするとExceptionが拡張されちゃう?っぽいので、
それぞれExceptionを拾うか
catch(\Exception $e)
と\をつけておくと良いっぽいです。
<?php
namespace Facebook\WebDriver\Chrome;
require_once('vendor/autoload.php');
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use PHPUnit\Framework\TestCase;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\Chrome\ChromeDevToolsDriver;
// selenium
$seleniumhost = 'http://localhost:4444/wd/hub';
// chrome ドライバーの起動
$driver = RemoteWebDriver::create($host,DesiredCapabilities::chrome());
// ChromeDevToolsDriverの設定
$devTools = new ChromeDevToolsDriver($driver);
//アクセスをブロックしたいURL
$devTools->execute('Network.enable');
$devTools->execute('Network.setBlockedURLs', ["urls"=> [
"http://hogehoge/*/img/*.png",
"http://hogehoge/img/*/*/*.gif",
]
]
);
$oktitle="タイトル";
try{
$driver->get($url);
$driver->wait(1)->until(
WebDriverExpectedCondition::titleIs($oktitle)
);
$html = $driver->getPageSource();
}
catch (\Exception $e) {
echo "Exception: " . $e->getMessage() . PHP_EOL;
}