uzullaがブログ

uzullaがブログです。

Raspberry pi zero wでウェブサイトのスクショを取る(firefox+selenium+python)

現在GW真っ只中の深夜4時半ですが、管理しているサーバーの一つからアラートがとんできておこされたuzullaですこんばんわ。

再起動をかけてみたけどかえってこないので、サーバー業者に問い合わせをして今にいたります。ファイルシステムがぶっこわれている気がします、こまりますね。

さて本題

raspberry pi zero wで、あるウェブサイトのスクショ画像を作成したいのですが、どうやるべきか。

最近だとchrome にheadlessモードが追加されてそれをつかうのがベターだとおもうのですが、raspberry pi zero w にはまだv59は降ってこないので手でビルドする必要があります。しかし、ISSUEなどをみているかぎりビルドは超大変っぽいので手を出す気がおきません。

ということで、Firefox+seleniumPythonでやってみます。

オチ

すっごい遅いから、やめた方が良い。

セットアップ

$ sudo apt install firefox-esr xvfb -y
# geckodriverを入手します。本家のリリースは以下なのですが、arm7です、raspi zeroはarm6である必要があります。
# https://github.com/mozilla/geckodriver/releases

# かといって、rustでビルドするのはしんどい、ので、無保証のblobを今回つかってみました。
# 正直良い行動とはいえませんので、みなさんはビルドしましょう。

# https://github.com/d0ku/GeckoDriver_ARMv6/tree/0.18.0
$ wget https://github.com/d0ku/GeckoDriver_ARMv6/raw/0.18.0/geckodriver
$ chmod +x geckodriver
$ mv geckodriver /usr/local/bin
# いるのかわかりません
$ xvfb-run firefox -CreateProfile default
# Pythonでやりたいので、ライブラリをいれます
$ sudo python -m pip install selenium
$ sudo python -m pip install pyvirtualdisplay

以下のようなコードを書き、実行します。

from selenium import webdriver
from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()

driver = webdriver.Firefox()
driver.get('http://s.cfe.jp')
driver.save_screenshot('screenshot.png')
driver.quit()

大体1〜2分くらいかかってスクショができます。おつかれさまでした

なお、本ブログサイトは10分くらいねばった上で、メモリ不足でおちました。 マイコンから見れば無尽蔵の性能をもつraspberry pi zero w とはいえ、こういう処理荷が重かった模様。

トラブルシュート

geckodriver.logをみましょう。

大抵は仮想ディスプレイ(xvfbとか)がうまくいってないんじゃないですかね。

firefoxが終了しない

ISSUEにもあるのですが、なにかしらダイアログをだして固まるようです。荒々しく皆殺しです。

$ killall geckodriver
$ killall firefox-esr
$ killall Xvfb

まとめ

上にもかきましたが、Web1.0的なしょぼいサイト以外ではなかなかきびしい。むりやりswap領域をふやしたり、Headless Firefoxを使い回せばいいのかもしれませんが、そうもいってられないこともある。

外部のスクリーンショット生成APIを使う方が良いですね。

さて、皆様の楽しいGWを祈っております。