今回はSeleniumを使ってHeadless Chromeを操作してみます。
コードはGitHubにまとめました。
追記
- 8/9 並列実行を実装
実行環境
- maxOS Sierra ver. 10.12.6
- Python 3.6.1
- Google Chrome 59.0
Headless Chromeとは
Google Chrome 59から導入されたChromeを画面表示せずに動作するモード。これにより、自動テストやUIがないサーバ環境で使えるとのこと。
*WindowsのみChrome 60からサポートされるみたいです
準備
- 最新版Chromeをインストール
- Python 3.6をダウンロード (virtualenvを使うことをおすすめします)
- Selenium等を依存ライブラリのインストール
Python依存ライブラリ
今回は以下のライブラリを使います
- Selene - SelenideをPythonで実装したものでSeleniumを扱いやすくしてくれる *
- python webdriver manager - ブラウザのドライバを自動インストールおよび管理してくれます**
- Selenium
- joblib - 並列化実行に使用
*まだα版なためAPIが変更する可能性があります
**インストールされたドライバはデフォルトで~/.wdm/ 以下に保存されます
依存ライブラリインストール
pre-releaseの最新版のseleneをインストールします。
上記のライブラリはseleneインストール時に同時に入ります。
また、sixはなぜか依存しているのに一緒に入らなかったので別途インストールします。
pip install selene --pre pip install six
サンプルコード
Google検索を行い、その結果をスクリーンショットする簡単なものとなっております。
sample_selene.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selene.driver import SeleneDriver
from webdriver_manager.chrome import ChromeDriverManager
# run chrome headless
options = Options()
options.add_argument('--headless')
# install chromedriver if not found and start chrome
driver = SeleneDriver.wrap(webdriver.Chrome(executable_path=ChromeDriverManager().install(), chrome_options=options))
# search 'python' in google
driver.get('https://www.google.co.jp/')
input = driver.find_element_by_name('q')
input.send_keys('Python')
input.send_keys(Keys.RETURN)
# save screen shot
driver.save_screenshot('result.png')
driver.quit()
実行結果は以下の通りとなっています。
サンプルコードの並列化
sample_selene_parallel.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selene.driver import SeleneDriver
from webdriver_manager.chrome import ChromeDriverManager
from joblib import Parallel, delayed
# search 'keyword' in google
def google(url, keyword):
# run chrome headless
options = Options()
options.add_argument('--headless')
driver = SeleneDriver.wrap(webdriver.Chrome(executable_path=ChromeDriverManager().install(), chrome_options=options))
driver.get(url)
input = driver.find_element_by_name('q')
input.send_keys(keyword)
input.send_keys(Keys.RETURN)
# save screen shot
driver.save_screenshot(keyword + '.png')
driver.quit()
url = 'https://www.google.co.jp/'
keywords = ['Python', 'Google', 'Selenium']
# n_jobs=-1 means use all of the resources you can`
Parallel(n_jobs=-1)(delayed(google)(url,keyword) for keyword in keywords)