pythonとseleniumで firefoxを仮想バッファ(xvfb)で操作し、WEBサイトのスクリーンショットを取得する方法です。
phantomJSで綺麗に画面のスクリーンショットを取得できない場合は、この方法がおすすめです。php+phantomJSでWEB画面キャプチャを簡単に実装
pythonインストール
Google Compute EngineのCentOS7では
pythonがデフォルトで入っているので、バージョンを確認
入っていない場合はインストールしてください。
1 2 |
[root@test-server ~]$ python --version Python 2.7.5 |
仮想バッファバッファ(xvfb)をインストール
xvfbと、ブラウザ表示が文字化けしないようにフォントを入れます。
1 2 |
[root@test-server ~]$ yum install xorg-x11-server-Xvfb [root@test-server ~]$ yum install ibus-kkc vlgothic-* |
pipでseleniumとpyvirtualdisplayをインストール
pyvirtualdisplayは、xvfbを操作するライブラリです。
1 2 3 4 5 6 7 |
[root@test-server ~]$ curl -kL https://bootstrap.pypa.io/get-pip.py | python [root@test-server ~]$ pip install selenium [root@test-server ~]$ pip install pyvirtualdisplay [root@test-server ~]$ pip show selenium Name: selenium Version: 3.6.0 |
geckodriverとfirefoxをインストール
geckodirverとは seleniumからfirefoxを使うためのドライバです。
ここに最新版があります。
https://github.com/mozilla/geckodriver/releases/
1 2 3 4 |
[root@test-server ~]$ wget https://github.com/mozilla/geckodriver/releases/download/v0.19.0/geckodriver-v0.19.0-linux64.tar.gz [root@test-server ~]$ tar zxvf geckodriver-v0.19.0-linux64.tar.gz [root@test-server ~]$ yum install firefox |
pythonプログラム
URLを記載したlist.txtを読み、そのURLのWEBキャプチャを取るようなプログラムを書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# coding: utf-8 from pyvirtualdisplay import Display from selenium import webdriver import time import os # 仮想ディスプレイ起動 display = Display(visible=0, size=(1024, 768)) display.start() dir = '/root' f = open(dir + '/list.txt') lines = f.readlines() f.close() # FireFox起動 browser = webdriver.Firefox() for line in lines: try: url = line.replace('\n','').replace('\r','') file = url.replace(':','_').replace('/','_').replace('?','_').replace('~','_') filename = dir + '/' + file + '.png' print url if os.path.exists(filename): print 'file exists' else: browser.get(url) browser.save_screenshot(filename) #print browser.page_source time.sleep(5) except: break # FireFoxを閉じる browser.close() # 仮想ディスプレイを終了 display.stop() |
/root/list.txtに 試しにhttp://www.yahoo.co.jp/と書きこみ、以下コマンドを実行してみてください。
1 |
[root@test-server ~]$ python screenshot.py |
selenium.common.exceptions.WebDriverException: Message: connection refused
と出る場合は、firefoxのバージョンが古い可能性があります。
geckodriver v0.19.0の環境推奨は、
Firefox 55.0 (and greater)
Selenium 3.5 (and greater)
なので、firefoxをバージョンUPします。
(centos7で通常yumでいれると、現在はfirefox 52.4.0でした)
[root@test-server ~]# firefox -V
Mozilla Firefox 52.4.0
1 2 3 4 5 |
[root@test-server ~]$ cd /opt/ [root@test-server opt]$ wget http://releases.mozilla.org/pub/firefox/releases/57.0b9/linux-x86_64/ja/firefox-57.0b9.tar.bz2 [root@test-server opt]$ tar xvf firefox-57.0b9.tar.bz2 [root@test-server opt]$ rm /usr/bin/firefox [root@test-server opt]$ ln -s /opt/firefox/firefox /usr/bin/firefox |
1 2 |
[root@test-server tmp]$ firefox -v Mozilla Firefox 57.0 |
これでfirefoxのバー上アップが完了です。
以下のようなエラー
XPCOMGlueLoad error for file /opt/firefox/libmozgtk.so:
libgtk-3.so.0: cannot open shared object file: No such file or directory
Couldn’t load XPCOM.
と出る場合は、gtk3をいれます。
1 |
[root@test-server opt]$ yum install gtk3 |
もう一度以下コマンドを打ち、スクリーンショットができていたら成功です
[root@test-server ~]$ python screenshot.py