Firefox on CUI 今と昔
こんなタイトルですが、要は ヘッドレスモードの実装の歴史による利用者の意識範囲がかわったよ話です。
スクレイピングの為にCUIで使いたくなったのですが、ヘッドレスモードを使う入り口がわからず。(原因不明の)Firefox自体の起動もままならなかったため、あっち試したり・こっち試したりと、紆余曲折しました。今はXvfbもいらないし、PhantomJSもサポートされてないから、2019年なら綺麗に整理されFirefox(or Chrome)使おうねというのが結論。
Headless モード 実装前
ヘッドレスモードが実装されてない = GUI前提で動作する。でも、CUIだとX Windowsが動作してないので通常Firefoxは起動できなかった。Firefox 55よりまえ (Win/Macだと56より前。2017年夏より前のタイミング) の話。
そこで、CUIで動かすため、Xvfbという仮想ディスプレイフレームバッファを使って動作させていたようです。
Firefoxがエラーで動作させれなかった初期の頃は、ここも疑ったりして Xvfbインストールしてましたが(2019年現在では)いらぬ努力でした。。(ま、知識は深まったが)
PhantomJS
ヘッドレスモードといえば、ということで出てくるのが JS実装の PhantomJS。これが活躍しだしたころは、まだFirefoxにはヘッドレスモードがなかったのですよね。
いっときこちらに逃げようと思いましたが、メンテナンス終了のアナウンスがすでにでており、Seleniumからも Firefox/Chrome を使うようにメッセージがでていたため断念。
Headless モード実装後
Xvfbがなくても、Firefox単体で、CUI上でも動作が可能になりました。パチパチパチ!
Wikipedia の Firefox リリース履歴には記述あった (headless で検索。集合知すごい)
Firefoxをパッケージマネージャでインストール。その後、コマンド一発です。
$ firefox -headless
CentOS 6 でも v60.8 入りますし、公式のリポジトリから最新もOKなはず。
$ firefox -v
Mozilla Firefox 60.8.0
メモリは確保しましょう
ホストのメモリは、食います。食いますっていっても数GBとか使うわけじゃないですが。でも、クライアントアプリなので、タブ開きまくりとかしたら、最終的にないとはいえないか。当初1GBでapacheあがってるだけのサーバで動かしたら、結構Firefox落ちまくって、悩みました。2GBにしたら、全然その問題でなくなるという。。。
次のエラーはかれても、解決できませんってもう。という感じでした。
$ firefox -headless *** You are running in headless mode. [Parent 26492, Gecko_IOThread] WARNING: Failed to launch tab subprocess: file /builddir/build/BUILD/firefox-60.8.0/ipc/glue/GeckoChildProcessHost.cpp, line 524 [Parent 26492, Gecko_IOThread] WARNING: pipe error (28): 接続が相手からリセットされました: file /builddir/build/BUILD/firefox-60.8.0/ipc/chromium/src/chrome/common/ipc_channel_posix.cc, line 342 ... ^C
つかってたVPSがOpenVZだったので free でみても空きが確認できないことを忘れてたことも原因ですが。。
Chromeじゃないのは
Chromeを使わなかったのは、CentOS のリポジトリに存在しなさそうだったのと、WebDriverのバージョンが頻繁にあがるのでメンテナンス大変かと思ったからです。 (Chroniumならあるのかな?)
FirefoxのWebDriverは、けっこうざっくりな対応なので、ブラウザ側のバージョンが変わっても、頻繁にはメンテナンスが不要かなと思っています。(動作の依存関係はなるべく減らしたいという、個人的な気持ちと相まって。いままでPythonだけでやってたスクレイピングに、ブラウザ足すだけでも気持ちが重いわ)
- Supported platforms — Mozilla Source Tree Docs 71.0a1 documentation
- geckodriver 0.21.0 以降なら、Firefox 57以降に対応。(ざっくりしすぎて、機能に影響があるのかなと心配になるぐらいw)
さぁ遠回りした分、開発すすめようっと!