Python + Chrome on CentOS7(Docker)でスクレイピング

## 概要
Pythonとchromeを使って、CentOS7上でスクレイピングをする環境を構築します。
Dockerで環境を構築します。

Golang版は、こちらです。
[Golang + Chrome on CentOS7(Docker)でスクレイピング](https://qiita.com/Esfahan/items/cf0fd87d0e3bc3194bd8)

## 関連記事
- [docker(docker-engine), docker-composeのインストール](https://qiita.com/Esfahan/items/aa5802548ee42d8a98de)
- [Dockerコマンド よく使うやつ](https://qiita.com/Esfahan/items/52141a2ad741933d7d4c)
- [Python + PhantomJSでスクレイピング](https://qiita.com/Esfahan/items/4655a954e8e7e7c557a4)

## 環境構築
以下の内容はGitHubにpushしてあるので、こちらをcloneしていただいてDockerを起動させれば実現できます。
https://github.com/Esfahan/docker-python-chrome

## ディレクトリ構成
以下のディレクトリ構成を前提とします。
/codeは、dockerコンテナにマウントさせる領域です。

```
code/
Dockerfile
files/
```

### google-chrome.repo
google-chromeを取得するためのレポジトリファイルを作成します。
files/etc/yum.repos.d/google-chrome.repoとして作成します。

```ini
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

### Dockerfileを作成

```Dockerfile
From centos:7

ARG PY_VER=3.7.1
ARG CHROME_DRIVER_VER=2.43

RUN yum update -y

##################
# Python, pip
##################
# Dependencies
RUN yum -y install zlib \
                   tk-devel \
                   tcl-devel \
                   ncurses-devel \
                   gdbm-devel \
                   db4-devel \
                   readline-devel \
                   zlib-devel \
                   bzip2-devel \
                   sqlite-devel \
                   openssl-devel \
                   libXext.x86_64 \
                   libSM.x86_64 \
                   libXrender.x86_64 \
                   gcc \
                   gcc-c++ \
                   libffi-devel \
                   python-devel \
                   patch \
                   bzip2 \
                   make

# python
RUN curl -O https://www.python.org/ftp/python/${PY_VER}/Python-${PY_VER}.tgz
RUN tar zxfv Python-${PY_VER}.tgz

WORKDIR Python-${PY_VER}
RUN ./configure --enable-unicode=ucs4 --prefix=/usr/local
RUN make
RUN make install

# pip
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py

# symlink for python3.x
RUN  PY_MVER=$(echo ${PY_VER} | sed s/\.[0-9,]\.[0-9,]*$//g); \
echo ${PY_MVER}; \
if [ "${PY_MVER}" = "3" ]; then \
      ln -s /usr/local/bin/python3 /usr/local/bin/python; \
      ln -s /usr/local/bin/pip3 /usr/local/bin/pip; \
fi

# pip modules
RUN pip install --upgrade pip
RUN pip install selenium

########################
# chromedriver, chrome
########################
# chromedriver
RUN yum install -y unzip
RUN curl -O https://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VER}/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip
RUN mv chromedriver /usr/local/bin/

# Dependencies
RUN yum install -y libX11 \
                   GConf2 \
                   fontconfig

# chrome
ADD files/etc/yum.repos.d/google-chrome.repo /etc/yum.repos.d/google-chrome.repo
RUN yum install -y google-chrome-stable \
                   libOSMesa

# fonts
RUN yum install -y google-noto-cjk-fonts \
                   ipa-gothic-fonts
```

### build

```
$ docker build -t python-chrome:latest ./
```

### コンテナ起動

```
$ docker run --name python-chrome-container \
             -v $(pwd)/code:/code \
             -itd python-chrome:latest /bin/bash
```

## Pythonのスクリプトを作成
code/main.pyとして作成します。

```py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)

driver.get('https://www.google.co.jp/')
print(driver.title) #=> Google
driver.save_screenshot('Google.png')
```

## 実行
これを実行すると、Googleのトップページのtitleである`Google`が表示され、Google.pngとして、スクリーンショットが作成されます。

```shell-session
$ docker exec -it python-chrome-container /bin/bash -c 'python /code/main.py'
Google
```


`Prevent Error: Fontconfig warning: "/etc/fonts/fonts.conf", line 86: unknown element "blank"`というエラーが出る場合は、/etc/fonts/fonts.confの、`<blank>`と`</blank>`の削除、もしくはコメントアウトをして下さい。

参考：[発生したエラーについて](https://qiita.com/aibax/items/fade7e417f6c096a879b#%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)


## 参考
- [CentOS7上でSeleniumからGoogle Chromeのヘッドレスモードを利用する](https://qiita.com/yuki-k/items/716bd05f087fc0f835bf)
- [Amazon Linux 2 で Headless Chrome を動かしてみた](https://qiita.com/aibax/items/fade7e417f6c096a879b)