ログイン認証が必要な Web ページの内容をスクレイピングしたくなったので Selenium を使ってみる事にしました。
認証が必要なページを自力でスクレイピングしようとすると中々大変なので、ブラウザの Google Chrome を Selenium (& ChromeDriver) から操作してしまおうという感じです。
今回試した環境は下記となります。
- CentOS6 もしくは Centos7
- Python 3.6.8 (pyenv)
- Selenium 3.11.0
- Google Chrome 73
- ChromeDriver 73.0.3683.68
目次
スポンサーリンク
ChromeDriverとフォントのインストール
まず始めは Chrome を外部から操作できるように ChromeDriver (WebDriver) をインストールします。
また、ブラウザのスクリーンショットを撮った時に日本語が文字化けしないようにフォントの調整も行います。
まずはインストールの準備から。
# yum -y install libX11 GConf2 fontconfig
ChromeDriver を公式からダウンロードしてインストールします。
# wget https://chromedriver.storage.googleapis.com/73.0.3683.68/chromedriver_linux64.zip # unzip chromedriver_linux64.zip # mv chromedriver /usr/local/bin/ # chmod 755 /usr/local/bin/chromedriver
最新バージョンは公式で確認してください。
CentOS7 の場合はこれで大丈夫ですが、CentOS6 の場合は追加で調整をします。
CentOS6の調整箇所
CentOS6 の場合は GLIBC のバージョンが古いらしくこのようなエラーが出ました。CentOS6は「ChromeDriver 2.38.551591」で検証しています。
# chromedriver --version chromedriver: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by chromedriver)
これに対応するために GLIBC のバージョンを上げます。
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm rpm -Uvh glibc-2.17-55.el6.x86_64.rpm \ glibc-common-2.17-55.el6.x86_64.rpm \ glibc-devel-2.17-55.el6.x86_64.rpm \ glibc-headers-2.17-55.el6.x86_64.rpm
もう一度動作確認をしてみます。
# chromedriver --version ChromeDriver 2.38.551591 (bcc4a2cdef0f6b942b2bb8049068f65340fa2a69)
これでOK。ただ、他への影響は未確認なのでご注意ください。
日本語フォントのインストール
次に日本語フォントのインストールですが、今回は Windows でお馴染みのメイリオを日本語フォントとして使います。
文字化けしなければフォントは何でも良いとは思いますが、スクリーンショットを撮った時に見慣れているフォントの方がしっくり来るのでここは好みでこれを使う事にしました。
メイリオのフォントファイルは Windows 環境が別途必要なので、これを使わない人はここを飛ばして次で解説する別の日本語フォントのインストール方法を参照してください。
メイリオフォントをインストールする場合
Windows10 を使ってログインユーザーのデスクトップにフォントファイルをコピーします。
下記はコマンドプロンプトを使う例ですが username の部分は利用する環境に合わせてください。
> cd C:\Users\username\Desktop > mkdir Meiryo > copy C:\Windows\Fonts\meiryo.ttc Meiryo > copy C:\Windows\Fonts\meiryob.ttc Meiryo
デスクトップに作成した Meiryo フォルダをサーバにアップして、フォントをインストールします。
# mv Meiryo /usr/share/fonts/ # fc-cache -fv
fc-cache でフォントキャッシュを更新すれば完了です。
他のフォントをインストールする場合
他には Google Noto Fonts を使う方法と、定番の IPA フォントを使う方法があります。
Google Noto Fonts でも良かったのですが、検証した CentOS7 の環境では微妙に文字化けする現象が起きてしまいました。
その場合、IPA フォントを入れるととりあえず解消されるので二通りのやり方を残しておきます。
Google Noto Fonts のインストール
# wget https://noto-website-2.storage.googleapis.com/pkgs/Noto-hinted.zip # mkdir Noto-hinted # unzip -d Noto-hinted Noto-hinted.zip # mkdir -p /usr/share/fonts/opentype/noto # cp *otf *ttf /usr/share/fonts/opentype/noto # fc-cache -fv
Google Noto Fontsは容量が大きめなので空き容量に注意。
IPA Fonts のインストール
# yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts # fc-cache -fv
こちらは yum でサクッと入ります。
これで ChromeDriver とフォントのインストールは完了です。
Google Chromeのインストール
次は CentOS に Linux 用の Google Chrome をインストールします。
CentOS6
CentOS6 の場合は必要な依存ファイルが多いので下記インストールスクリプトを使うのが簡単です。
# curl https://intoli.com/install-google-chrome.sh | bash
何やら色々インストールされますがこのスクリプトが何をしているかは下記ページで説明されています。
Centos7
CentOS7 の場合は yum からサクッと入りますので、まずは Chrome 用のリポジトリを追加します。
# vi /etc/yum.repos.d/google-chrome.repo ----- ここから ----- [google-chrome] name=google-chrome baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64 enabled=1 gpgcheck=1 gpgkey=https://dl.google.com/linux/linux_signing_key.pub
続いて yum でインストールします。
# yum -y install google-chrome-stable libOSMesa
libOSMesa は CentOS7 でクラッシュする問題に対応するために入れた方がいいらしい。
プログラムを実行してみてエラーがでなければインストール完了です。
# google-chrome --version Google Chrome 73.0.3683.86
Seleniumのインストール
pyenv を使って Python3 のセットアップと Selenium のインストールを行います。
pyenv および Python3 のインストールは下記を参照してください。
$ sudo pip install selenium $ vi headless.py
headless.py にはこのようなコードを記述します。
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--window-size=1280,1024') driver = webdriver.Chrome(options=options) driver.get('https://worklog.be/') driver.save_screenshot('test.png') driver.quit()
これを実行するとこのようなスクリーンショットが撮れます。
インストールは少々大変ですが、シンプルな記述でブラウザを操作できるので非常に便利です!
ChromeDriverのUAを変更する
おまけで ChromeDriver が吐き出す UA の変更方法について。
デフォルトだとこのような UA を残します。
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/66.0.3359.117 Safari/537.36
HeadlessChrome と出すようです。
これを変更するには webdriver にこのようなオプションを追加すると OK です。
from selenium import webdriver from selenium.webdriver.chrome.options import Options ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36' options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--window-size=1280,1024') options.add_argument('--user-agent=' + ua) . . .
簡単ですね。
以上で、Selenium のセットアップは完了です。
google-chromeをyumでインストールする前に鍵の登録をしないといけないですね。
wget https://dl.google.com/linux/linux_signing_key.pub
sudo rpm –import linux_signing_key.pub
が必要かと思います。
https://www.google.com/linuxrepositories/
gpgkey は google-chrome.repo で指定しているので、yum をした時に一緒にインポートできないでしょうか?
大変丁寧な記事で、とても参考になりました…!泣
本当にありがとうございます。