Headless chromeでSelenium使ってみた

今回はSeleniumを使ってHeadless Chromeを操作してみます。

コードは[GitHub](https://github.com/kaitoii11/selenium-headlesschrome)にまとめました。

### 追記
+ 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からサポートされるみたいです

# 準備
1. 最新版[Chrome](https://www.google.com/chrome/index.html)をインストール
2. Python 3.6をダウンロード (virtualenvを使うことをおすすめします)
3. Selenium等を依存ライブラリのインストール

## Python依存ライブラリ
今回は以下のライブラリを使います

+ [Selene](https://github.com/yashaka/selene) - [Selenide](http://selenide.org/)をPythonで実装したものでSeleniumを扱いやすくしてくれる *
+ [python webdriver manager](https://github.com/SergeyPirogov/webdriver_manager) - ブラウザのドライバを自動インストールおよび管理してくれます**
+ Selenium
+ [joblib](https://github.com/joblib/joblib) - 並列化実行に使用



*まだα版なためAPIが変更する可能性があります

**インストールされたドライバはデフォルトで~/.wdm/ 以下に保存されます

### 依存ライブラリインストール
pre-releaseの最新版のseleneをインストールします。
上記のライブラリはseleneインストール時に同時に入ります。
また、sixはなぜか依存しているのに一緒に入らなかったので別途インストールします。

`pip install selene --pre
 pip install six`

## サンプルコード
Google検索を行い、その結果をスクリーンショットする簡単なものとなっております。

```python: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()
```

実行結果は以下の通りとなっています。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/41505/1c277e5d-281b-883a-4797-169f7a3f194d.png)

## サンプルコードの並列化

```python: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)
```

実行結果は以下の通り。Pythonの結果は割愛。
![Google.png](https://qiita-image-store.s3.amazonaws.com/0/41505/cc60c592-c786-87bd-959b-85a15a021374.png)

![Selenium.png](https://qiita-image-store.s3.amazonaws.com/0/41505/2f6aa850-c2ea-177d-da3f-9fde6f261814.png)


# 参考リンク
+ https://developers.google.com/web/updates/2017/04/headless-chrome　

+ https://github.com/yashaka/selene
+ https://github.com/SergeyPirogov/webdriver_manager
+ http://qiita.com/orangain/items/db4594113c04e8801aad