CentOSでChromeDriver、GoogleChrome、Seleniumを使う方法を解説

Python プログラミング

こんにちは、はるです。

はてな顔

悩む人 GoogleDriverとGoogleChromeを導入したいんだけどどうやるの? Seleniumを使えるようになりたい。

こんな悩みを解決していきます。 

結論、ChromeDriverとGoogleChromeをインストールして、Selenium
を使っていくやり方は2つあります。
chromedriver-binaryを使うか、使わないかです。

私はbinaryを使うほうがラクでした。
chromedriver-binaryを使う方法と使わない方法、順番に解説していきます。

記事の内容

  • chromedriver-binaryを使う方法
  • chromedriver-binaryを使わない方法

動作環境

  • CentOS7 さくらのVPS
  • メモリ 512 MB
  • ストレージ SSD 25 GB
  • CPU 1コア
  • Python 3.6.8

記事の内容

chromedriver-binaryを使う方法

chromedriver-binaryを使う方法
流れは以下のとおりです。

  • GoogleChromeをインストール
  • chromedriver-binaryをインストール
  • Seleniumをインストール
  • 実際のプログラムにインポートする

GoogleChromeをインストール

Chromeをインストールする前に、GoogleChromeリポジトリを追加していきます。

まずは、google-chrome.repoファイルを作って、

sudo 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

保存したあと、google-chrome-stableをインストールします。

sudo yum -y install google-chrome-stable
※libOSMesaを付けてインストールするとクラッシュに対応するようです。
付ける場合は以下とおり。
sudo yum -y install google-chrome-stable libOSMesa

次に、パージョンを確認します。

google-chrome --version
↓
Google Chrome 89.0.4389.114

出てきたバージョンはメモしておいてください。

chromedriver-binaryをインストール

ChromeDriver - WebDriver for Chromeというサイトを参考に、chromedriver-binaryをインストールしていきます。

先ほどメモしたChromeのバージョンと同じものを選んでください。

pip install chromedriver-binary==89.0.4389.23

chromedriver-binaryをインストール

Seleniumをインストール

さいご、Seleniumをインストールしていきます。

pip install selenium

実際のプログラムにインポートする

インストールは完了したので動かしていきます。
コピペして実際に使ってみてください。

Seleniumの公式ドキュメント
PythonでSeleniumを操作する

#完成版

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import chromedriver_binary

options = Options()
options.add_argument('--headless')
options.add_argument("--no-sandbox")

print('before')
driver = webdriver.Chrome(chrome_options=options)
print('after')
driver.get('https://www.google.co.jp/')

assert 'Google' in driver.title

input_element = driver.find_element_by_name('q')
input_element.send_keys('Python')
input_element.send_keys(Keys.RETURN)

assert 'Python' in driver.title

for h3 in driver.find_elements_by_css_selector('a > h3'):
  a = h3.find_element_by_xpath('..')
  print(h3.text)
  print(a.get_attribute('href'))

driver.quit()

文字化けする場合

viで.pyを編集するときに日本語が文字化けしたり、出力するときに変換エラーが出たりすることがあります。

#エラー内容
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinalnot in range(128)

そのときは、以下2つのコードで修正。

localectl set-locale LANG=ja_JP.utf8
source /etc/locale.conf

LANGがja_JP.utf8になっているか確認しましょう。

cat /etc/locale.conf
↓
LANG=ja_JP.utf8

chromedriver-binaryを使わない方法

chromedriver-binaryを使わない方法
流れは以下のとおりです。
binaryを使う時とほぼ同じですが、2と4番目が少し違うので、そこだけ解説します。

  • GoogleChromeをインストール
  • ChromeDriverのインストール
  • Seleniumをインストール
  • 実際のプログラムにインポートする

ChromeDriverのインストール

chromedriver-binaryをインストールする代わりに、ChromeDriverをインストールします。

ChromeDriver - WebDriver for Chromeというサイトに行き、インストールしたGoogleChromeと同じバージョンをクリック。
ChromeDriverのインストール
zipファイルが表示されます。
ダウンロードするのにURLが必要なので、Linux版のリンクアドレスをコピー。
ChromeDriverのダウンロードURL

wgetでダウンロードします。

wget https://chromedriver.storage.googleapis.com/89.0.4389.23/chromedriver_linux64.zip

次にzipを解凍。

unzip chromedriver_linux64.zip

/usr/local/bin/ にchromedriverを置きます。

sudo mv chromedriver /usr/local/bin/

chmodコマンドで、利用できるように権限を変更。

chmod 755 /usr/local/bin/chromedriver

念のため、バージョンを確認しておきましょう。

chromedriver -version
↓
ChromeDriver 89.0.4389.23 (61b08ee2c50024bab004e48d2b1b083cdbdac579-refs/branch-heads/4389@{#294})

Chromeと同じバージョンなら大丈夫です。

実際のプログラムにインポートする

chromedriver-binaryありのときは4行目でbinaryをインポートしていましたが、無しのときはbinaryのimport文を消すだけでOK。

公式ドキュメント
PythonでSeleniumを操作する

#完成版 chromedriver_binaryなし
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

options = Options()
options.add_argument('--headless')
options.add_argument("--no-sandbox")

print('before')
driver = webdriver.Chrome(chrome_options=options)
print('after')
driver.get('https://www.google.co.jp/')

assert 'Google' in driver.title

input_element = driver.find_element_by_name('q')
input_element.send_keys('Python')
input_element.send_keys(Keys.RETURN)

assert 'Python' in driver.title

for h3 in driver.find_elements_by_css_selector('a > h3'):
  a = h3.find_element_by_xpath('..')
  print(h3.text)
  print(a.get_attribute('href'))

driver.quit()

文字化けする場合

binaryありと同じく、文字化けしたときは以下2つのコードで修正してください。

localectl set-locale LANG=ja_JP.utf8
source /etc/locale.conf

LANGがja_JP.utf8になっているか確認しましょう。

cat /etc/locale.conf
↓
LANG=ja_JP.utf8

  
以上となります。

私自身、chromedriver-binaryに苦戦しました。
調べても、使っている人と使わない人がいて、意味不明、、、

chromedriver-binaryありなしの解説記事はたぶん無かったので、参考になれば幸いです。

参考