uzullaがブログ

uzullaがブログです。

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

一つ前の記事で、firefoxめっちゃ重くて駄目だったのでphantomjsを使う場合の話。

ページの大きさにもよるけど、なつかしさあふれるphantomjsはさすがに速い。軽いページなら10秒以下でうごく。

このブログも(表示はモバイル用?になってしまうけど)頑張れば一応レンダリング完了できる。

phantomjsをいれる

$ apt install phantomjs

トラブルシュート

本来上でphantomjsがはいると思うんだけれど、うまくうごかなかった。

$ /usr/bin/phantomjs --version
$ echo $?
1

バージョンがでてこないし、ステータスコードは0じゃないし、seleniumからも操作できないし※、なんかおかしいので以下から野良blobをDLしていれました。みなさんはちゃんとやろう。

*1

GitHub - aeberhardo/phantomjs-linux-armv6l: PhantomJS compiled on a Raspberry PI (Raspbian "wheezy").

$ wget https://github.com/aeberhardo/phantomjs-linux-armv6l/archive/master.zip
$ unzip master.zip
$ cd phantomjs-linux-armv6l-master/
$ tar xvjf phantomjs-1.9.0-linux-armv6l.tar.bz2
$ cd phantomjs-1.9.0-linux-armv6l/bin
$ sudo cp phantomjs /usr/local/bin/phantomjs
$ phantomjs --version
1.9.0
$ which phantomjs
/usr/local/bin/phantomjs

selenium.common.exceptions.WebDriverException: Message: Service /usr/bin/phantomjs unexpectedly exited.

PythonseleniumのLibをいれる

$ python -m pip install selenium

コードを書く

pjs_ss.py

#!python
from selenium import webdriver

driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs', service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any'])
driver.get("http://www.yahoo.co.jp/")
driver.save_screenshot("test.png")

driver.quit()
print("done")

※ めっちゃSSLエラー無視する指定してますが、皆さんはちゃんとしてください。

実行

$ python3.6 pjs_ss.py
/usr/local/lib/python3.6/site-packages/selenium/webdriver/phantomjs/webdriver.py:49: UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
  warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
done
$

test.pngが保存されていれば成功。

実行時にめっちゃWARNいわれますけど、そうはいうてもARMv6のRaspi zero向けにheadlessをサポートするバージョンのchromiumがないし(ビルドがどう考えても大変)、firefoxはめっちゃ遅かったんや…。

ただ、phantomjsはどうしてもWeb 1.0風のなつかしさあふれるページになりますね。(個人的にはこれで十分なのだが、UA設定したりすればもうちょっとマシになるのかね?)

まとめ

しょぼいサイトならphantomjsでなんとかなりそう、ただまあRaspberry pi zero w みたいな非力な環境でがんばるより、スクショを取れる公開Web APIを使ったほうが良い。

完全にラズパイ素人なので甘く見ていたのだけれど、ARMv6(Pi0とか)とARMv8(Pi 3Bとか)の溝はかなり深くて広い…、そしてARMv6はサポートしないよってかいてあるOSS多すぎウケるww。かといってPi 3B電気食い過ぎでしょ…。

こちらからは以上です。

余談

最近のchromium-browserのARMバイナリを配布しているところをみつけておとしてみたけど、Illegal instructionで動かず。

Packages in “Chromium dev” : Chromium dev : “Chromium team” team

$ readelf -a /usr/lib/chromium-browser/chromium-browser > txt
$ less txt
〜〜かなり後ろ〜〜
File Attributes
  Tag_CPU_name: "7-A"
  Tag_CPU_arch: v7

ウーン、v7以降ね…。

なおfirefox

File Attributes
  Tag_CPU_name: "6"
  Tag_CPU_arch: v6

勿論動いた。

まあ、chromiumをがんばってビルドする記事は結構みつかるんだけど、ARMとかいてあるけどそれv7の話だよね???というエントリしかみつからなかった。ARMv6でv59以降のchromiumをビルドするすべを募集中です…。

*1:phantomjs のバージョンの問題かもしれないとおもったけど、--versionうごかないのはさすがに??