Dockerでheadless-chromeを使ったスクレイピング環境を整える

# 結論

Dockerfileは以下。

```dockerfile
FROM ubuntu:16.04

# Install.
RUN \
  apt-get update && \
  apt-get install -y python3 wget curl unzip apt-utils && \
  curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
  python3 get-pip.py && \
  pip install --upgrade pip && \
  pip install selenium && \
  pip install beautifulsoup4 && \
  apt-get install -y libfontconfig && \
  mkdir -p /home/root/src && cd $_ && \
  wget -q -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip && \
  unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ && \
  apt-get install -y libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils && \
  touch /etc/default/google-chrome && \
  wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
  dpkg -i google-chrome-stable_current_amd64.deb && \
  apt-get install -y fonts-migmix

RUN apt-get install -y sudo

# add sudo user
RUN groupadd -g 1000 developer && \
    useradd  -g      developer -G sudo -m -s /bin/bash rotelstift && \
    echo 'rotelstift:password' | chpasswd

RUN echo 'Defaults visiblepw'                >> /etc/sudoers
RUN echo 'rotelstift ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# Set japanese
RUN apt-get install -y language-pack-ja-base language-pack-ja
RUN locale-gen ja_JP.UTF-8

# Set environment variables.
ENV LANG ja_JP.UTF-8
ENV PYTHONIOENCODIND utf_8

USER rotelstift

# Define default command.
CMD ["/bin/bash"]
```

で、立ち上げる時は以下のコマンドで。

```bash
docker run --privileged -v "path/to/local:path/to/container" -ti hogehoge
```

--privileged必須。

# ささやかな解説

### 基本
基本のDockerfileは以下を参考にしました。
[スクレイピング用のDockerコンテナをつくる](https://qiita.com/t-taira/items/61825b73d64c3d3c5816)
で、もうPhantomJSはメンテされないので代わりにheadless-chromeを使うことにします。

### pipはapt-getを使わないでインストール
apt-getを使ってインストールすると``pip3 install --upgrade pip``をやった時にpipが壊れるため。

### Chromeのインストール方法
[【その１】Python で headless-chrome でのスクレイピング（Docker Hub / Google CONTAINER REGISTER 登録編）](https://qiita.com/kojipon/items/e5686c1412a69905e4bf)
[headless chromeをPythonのseleniumから動かして引数を考えた (Ubuntu 16.04)](https://vaaaaaanquish.hatenablog.com/entry/2017/06/06/194546)
の二つをミックスイン。

```
curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE
```
で最新のバージョンを取る方法凄いです。

### 入れないと怒られるやつ
```
apt-get install -y libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils
```
あたり。

### 作業用ユーザーを作る
[Dockerコンテナ内にsudoユーザを追加する](https://qiita.com/iganari/items/1d590e358a029a1776d6)
をまるっと参考に。

### 日本語化
[Dockerにubuntuのコンテナを作成・日本語化する](https://qiita.com/kikako/items/5961628476abf61ee371)
をがっつり参考に。

# サンプルコード
```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.google.com')
print(driver.title)
```

これで``Google``と出たら成功です。

# 参考
[スクレイピング用のDockerコンテナをつくる](https://qiita.com/t-taira/items/61825b73d64c3d3c5816)
[【その１】Python で headless-chrome でのスクレイピング（Docker Hub / Google CONTAINER REGISTER 登録編）](https://qiita.com/kojipon/items/e5686c1412a69905e4bf)
[headless chromeをPythonのseleniumから動かして引数を考えた (Ubuntu 16.04)](https://vaaaaaanquish.hatenablog.com/entry/2017/06/06/194546)
[Dockerコンテナ内にsudoユーザを追加する](https://qiita.com/iganari/items/1d590e358a029a1776d6)
[Dockerにubuntuのコンテナを作成・日本語化する](https://qiita.com/kikako/items/5961628476abf61ee371)