[日誌] PHP+webdriver+Chrome(seleniumなし)でスクレイピング

JavaScriptがあるページをPHPでスクレイピング

壁は乗り越えるもの

以前、JavaScriptを使ったページの取得ができないため、PHPを使ったスクレイピングを諦めようかという記事を書きました。実際、自分では難しい、又は大げさな仕組みになり自宅サーバーでは負担が大きすぎると思っていました。

[blogcard url=”https://co2.ddns.net/work-blog/javascript_hazard_2018-01-29/”]

VBAを使ったスクレイピング

VBAを使えば、InternetExplorerのオブジェクトを使って、容易にスクレイピングができるのもわかっていました。ただ、これも重いです。特定の特許事務所のホームページをロボットで調べるとしても重すぎると感じました。WinHTTPRequest, Msxml2.XMLHTTP.3.0等と組み合わせてhybridとして使おうとも考えていました。WordPressのデータベースとも連携できるし、実現可能性は高い。しかし、実際に実装するには道のりが長すぎる。何より文字列操作を多用しようと思っていたので、VBAでは貧弱すぎるという課題がありました。

やっぱりPHP

VBAにも壁を感じていたとき、ふと「PHPでブラウザ自動化」にたどり着きました。自分で言うのもなんですが往生際が悪い。するとこのページにはPHPからwebdriverで直接Chromeが動かせることが書いてありました。つまりJavaの上で動くSelenium Standalone Serverが要らない。Apache httpd, mariadbがすでに動いているのに余計なものまで動かしたくなかったのです。しかもポート4444というものを使うし。でも、単独で動かせるなら便利。サンプルを見ながら実装してみました。

改良点

一番困ったのは、ページの読み込み終了の見極めです。サンプルの多くが、ブラウザのタイトルが「検索」を含む文字になったらとか言うものでした。私がしたいことは特許事務所のホームページ巡りなので、特定の言葉がタイトルに現れることはありません。ただ、もともと<body>のなかにあるリンク<a href=”></a>が探したくて、このスクレイピングを始めたので、JavaScript等の読み込みの終了条件は、リンクが表示されたら終わるというものにしました。

    // リンクを有するものが現れるまで待つ
    $driver->wait()->until(
        WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(WebDriverBy::tagName('a'))
    );

PHP Again

phpQueryに始まり、Goutte, PhantomJSそしてVBAに寄り道をしたもののPHP+webdriver+Chromeで以下の目標もなんとかできそうな気がしてきました。Chromeは、少しでも軽くすために画像を読み込まない設定にしておこうかと思います。

[blogcard url=”https://co2.ddns.net/work-blog/next_target_2018-01-25/”]

まとめ

やりたいことリストに書いて、壁を感じていたのですが、日々何か探していると進歩があるようです。累積的進歩! 好きな言葉です。ただ、DIYでは時間が足りず、まだまだ時間はかかると思いますが、気長に見守ってやってください。

コメントを残す

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