R使いが今すぐ知るべきHeadless Chromeの現状

とかいうタイトルを書いておきながらそんなに知らないので詳しい人教えてください。

ヘッドレスとは

「Headless Chrome」というものを聞いたことがあるでしょうか。ヘッドレスなChromeです。

ここで言う「ヘッドレス」とは、GUIなしで動作することです。Headless Chromeの公式ページ曰く、

ヘッドレスブラウザは、GUI を持つ必要のない自動テスト環境やサーバー環境にとてもよいツールです。

とあるように、これはウェブサイトのスクリーンショットを撮ったり、スクレイピングをしたいRユーザにとっても便利な機能です。

PhantomJS

なぜChromeにこんな機能が付いたかというと、ヘッドレスブラウザへの需要が以前からあったためです。PhantomJSはそんなヘッドレスブラウザの先駆者です。これは、Rでスクリーンショットを撮るためのパッケージ・webshotの中でも使われています。webshotパッケージについての説明はkazutanさんの以下のページがまとまっています。

しかし、PhantomJSは「みんなが使っているブラウザの挙動をがんばって真似する」ための戦いであり、メンテが大変でした。Headless Chromeの登場によって、「真似する」までもなく本物のブラウザの挙動がヘッドレスでできるようになったわけで、PhantomJSの意義はあまりなくなります。PhantomJSを一手に支えていたメンテナはリタイアを宣言、PhantomJSにはもう未来がありません。

[Announcement] Stepping down as maintainer

そんなわけで、webshotパッケージもどこかのタイミングでHeadless Chromeに乗り換えることが検討されています。

Headless Chromeスクリーンショットを撮るには

ちなみに、スクリーンショットを撮るだけであればすでにパッケージはあります(まだCRANには上がっていない)。

が、このパッケージをインストールせずとも、Headless Chromeを使ってスクリーンショットを撮るのは簡単にできます。

用意するのは、どこのご家庭にでもある普通のChromeです。はい、そうです。「Headless Chrome」という特殊なChromeがあるわけではなく、普通にインストールされているChrome--headlessを付けるとヘッドレスモードになるのです。 ヘッドレス Chrome ことはじめ  |  Web  |  Google Developersにあるように

/path/to/chrome --headless --disable-gpu --screenshot https://www.chromestatus.com/

とすればスクリーンショットが撮れるはずです。(が、手元のWindowsではうまく動かなかった。なぜ...?)

RSeleniumへの影響は?

さて、上に、

これはウェブサイトのスクリーンショットを撮ったり、スクレイピングをしたいRユーザにとっても便利な機能です。

と書きました。前半の答えは分かりましたが、後半、スクレイピングをしたいRユーザに影響はあるのでしょうか。

これはHeadless Chromeとは直接は関係ないような気もしますが、Headless Chromeの隆盛によって、将来的にはRSeleniumなしでスクレイピングできる日が来るかもしれません。ちょっと前には公式からこんなツールが提供されたと話題になっていました。

ChromeにはDevtools Protocolというのがあり、外部からChromeを操作することが可能です。このpuppeteerというライブラリもDevtools Protocolを使っています。

そして、何を隠そうSeleniumもこのDevtools Protocolを使っています。正確には、Devtools Protocolの上にWebDriver というインタフェースを作って、Seleniumはそこを介してChromeを操作しているのです。

ChromeDriver - The official Selenium/WebDriver implementation for Chrome is implemented on top of the DevTools Protocol.
(https://github.com/ChromeDevTools/awesome-chrome-devtools#chrome-devtools-protocol)

つまり、今は

RSelenium --(WebDriver interface)--> Chrome Driver --(Devtools Protocol)--> Chrome 

という感じで通信しているのが、

puppeteerみたいなRパッケージ --(Devtools Protocol)--> Chrome 

という感じで直接通信できるようになるかもしれない、ということです。

ただし、そういうRパッケージが実装されるのは、あるとしてもだいぶ先でしょう。Devtools Protocolの通信はWebSocketでやり取りするんですが、RでWebSocketをやるのは、受信側はそんなに難しくなさそうなんですが(すでにいくつかパッケージもあります)、

どうも送信となると難しそうな雰囲気があります。少なくともこの先数年はRSeleniumに頼り続けるのかな?、というのが個人的な読みです。

ちなみに、Chromeを直接操作するツールが出てきたとしても、Seleniumは複数ブラウザに対応するツールとして残り続けるでしょう。Devtools ProtocolはChromeだけのもので、例えばFireFoxにはMozilla debugging protocolというものが存在したりしてばらばらです。この辺の差を埋めるものとしてはやっぱりWebDriver、つまりSeleniumな気がしています。

まとめ

  • PhantomJSはヘッドレスChrome(もしくはFireFox)に置き換わる
  • RSeleniumはそんなすぐには置き換わらないけど、いずれは置き換わるかも
  • 置き換わると、Chromeという大多数のユーザが簡単にインストールできるツールを使うので、PhantomJSとかSeleniumみたいにセットアップに苦しむことがなくなるという明るい未来が待っているのでは?(願望)
  • 「今すぐ知るべき」とかタイトルに書いたけど、まだ過渡期なので様子見でいい気がします()

という感じです。間違いあればご指摘ください。