AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

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上でも動作が可能になりました。パチパチパチ!

WikipediaFirefox リリース履歴には記述あった (headless で検索。集合知すごい)

Firefoxをパッケージマネージャでインストール。その後、コマンド一発です。

$ firefox -headless

CentOS 6 でも v60.8 入りますし、公式のリポジトリから最新もOKなはず。

$ firefox -v
Mozilla Firefox 60.8.0

その後

そして、PhantomJSのメンテンス終了。Firefox , Chrome の ヘッドレスモードが主流に。

メモリは確保しましょう

ホストのメモリは、食います。食いますっていっても数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だけでやってたスクレイピングに、ブラウザ足すだけでも気持ちが重いわ)


さぁ遠回りした分、開発すすめようっと!