【python】selenium + chromeでスクリーンショットを撮影する

Kibanaを使い始めたはいいんだけど、毎週そのグラフを画像化して所定の場所に置く必要に迫られた。愚直に作業手順を考えてみると、WEBブラウザ開いて、ウインドウのサイズをいい感じに調整して、Alt+Printscreenして、mspaint開いてCtrl+Vで貼り付け、Ctrl+Sで所定の場所にpngで保存…とか地味にめんどくさい作業だ。といったところで、そんな作業はJenkin寿司に任せちゃいたいよね。

そこで色々とGoogle先生に調べてもらったところ、「selenium」なるものを使えばプログラムからWEBブラウザを意のままに操れて、スクリーンショットまで撮れちゃうらしいパねえ!seleniumを操れる環境は色々あるらしいんだが、マイフェイバリット言語であるpython3でやってみる事にした。ちなみに俺の試したアレは、以下のとおり。
 

OS Windows7 64bit
Python 3.4
Selenium 3.6.0
ChromeDriver 2.33

1.Seleniumをダウンロード

まず、このあたりからSeleniumをダウンロードしてくる。もちろん書いてあるとおりpipとかでよかですが、「selenium-某.tar.gz」をダウンロードしてきて、解凍して出てきたseleniumフォルダをpythonのインストールフォルダ直下のLibにぶっこむ方法でもOK。 C:\Python34\Lib\selenium ってな感じで。

2.WebDriverをダウンロード

俺は生粋のGoogle Chromeユーザーなのだが、プログラムからChromeを扱うにあたっては、Chrome専用のWEBドライバーなるものが必要らしい。昔はFirefoxユーザーだったんだけど、デバッグ機能とかの好みもあって、気がついたらChromeに乗り替わってたなぁ。フォクすけは好きなんだけど。もしゲーセンのUFOキャッチャーとかにフォクすけぬいぐるみ置いてあったら、そりゃもうアーム弱くても全力で連コインしちゃうよね。
 
ということで、ここの「Latest Release」のリンクから、「chromedriver.exe」をダウンロードしてくる。俺の意識の低さはとどまる所を知らないので、こいつもseleniumフォルダと同じ場所にぶちこんでみた。俺の場合は C:\Python34\Lib\selenium\chromedriver.exe ってな感じだが、実際どこ置いてもいいと思うぜ。

3.とりま動作確認

# coding: UTF-8

from selenium import webdriver

ch = webdriver.Chrome(executable_path=r"C:\Python34\Lib\selenium\chromedriver.exe")
ch.get(r"https://www.google.co.jp/")
ch.quit()

Googleパイセンの調べてきた内容をもとに、pythonでコードを書き殴ってみる。webdriverをimportしてきて、.Chromeの引数でexecutable_pathに、さっきぶちこんだexeのパスを指定してやる。あとは、getでURL指定して開くだけ。最後にquit()でブラウザを閉じる。
 

試しに Visual Studio Codeなんぞでステップ実行してみると、Chromeさんが「私、何者かに操られてます!」というアピールをしながらも、健気に動いてくれる姿を確認できる。

4.愚直に撮影してみる

ch.set_window_size(1000, 500)	# ウインドウサイズ指定
ch.get(url)			# URL開く
ch.save_screenshot(out_path)	# 指定パスに画像保存

ウインドウサイズを指定して、URLを開いて、その画像を保存するようなスクリプトを組んでみた。
これできっと、グラフ画像がいい感じに撮影できるはz・・・


アッー!ロード中の画面が撮影されてんじゃーん!いったいどうすりゃいいんだぜ・・・!

5.試行錯誤した結果


色々と一筋縄ではいかんかったので、最終的なソースを貼っておく。

まず、ローディング画面対策として、特定の要素が出現するまでウェイトする処理を入れてみた。ココから引っ張ってきたのだが、ぶっちゃけ中身よく分かってない。なんとなく分かるのは、WebDriverWaitの第二引数がタイムアウト時間で、「By.某」の部分でidやらclassname指定するんだろうなー、って感じ。ブラウザのデバッグ機能(ChromeのF12とか)を使えば、要素は簡単に洗い出せる。

あとは小細工として、execute_scriptを挟んでみた。こいつはjavascriptを実行するやつなのだが、Kibanaの元ページに変なメニューバーが入ってたので、無理やりjQueryでCSS弄って消してみた。ちなみに、KibanaでビジュアライズしてあるグラフはURLのケツにembed=trueつければ全画面化するみたい


結果、出来上がったのはこんな感じの画像。ゴリ押し感は否めないが、それとなく動くものはできたので、Jenkinsで定期的に呼び出してやって事なきを得た。seleniumは色々な事ができそうなポテンシャルを秘めているので、他の案件でも積極的に使ってみるかなー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)