スクレイピングした Web サイトからページ全体のスクリーンショットを撮影したい機会があった。 そこで Selenium の Python バインディングと Headless Chrome を使ったところ実現できたのでメモしておく。
使った環境は次の通り。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.13.5 BuildVersion: 17F77 $ python -V Python 3.6.5 $ pip list --format=columns | grep -i selenium selenium 3.13.0 $ chromedriver --version ChromeDriver 2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363)
下準備
まずは Chrome Driver をインストールしておく。
$ brew cask install chromedriver
続いて Selenium の Python バインディングをインストールする。
$ pip install selenium
インストールできたら Python の REPL を起動する。
$ python
これで下準備ができた。
スクリーンショットを撮る
まずは必要なパッケージをインポートする。
>>> from selenium import webdriver >>> from selenium.webdriver.chrome.options import Options
続いて Chrome Driver を Headless モードで起動する。
>>> options = Options()
>>> options.add_argument('--headless')
>>> driver = webdriver.Chrome(chrome_options=options)
スクリーンショットを撮りたいページの内容を取得する。
>>> driver.get('https://www.python.org')
続いてページ全体の高さを取得したら、それをウィンドウサイズとしてセットする。 これによって Web ページ全体のスクリーンショットを一つの画像として撮影できる。 ちなみに Headless モードにしていないと、ここで設定できる値がモニターの解像度に依存してしまう。
>>> page_height = driver.execute_script('return document.body.scrollHeight') >>> WIDTH = 1600 >>> driver.set_window_size(WIDTH, page_height)
あとはスクリーンショットを撮るだけ。
上手くいけば返り値として True
が返ってくる。
>>> driver.save_screenshot('screenshot.png') True
上手くいったらドライバと REPL を終了する。
>>> driver.quit() >>> exit()
撮影した画像を確認してみよう。
$ open screenshot.png
次のような結果が得られた。
ばっちり。
スマートPythonプログラミング: Pythonのより良い書き方を学ぶ
- 作者: もみじあめ
- 発売日: 2016/03/12
- メディア: Kindle版
- この商品を含むブログ (1件) を見る