こんにちは、はるです。
こんな悩みを解決していきます。
結論、ChromeDriverとGoogleChromeをインストールして、Seleniumを使っていくやり方は2つあります。
chromedriver-binaryを使うか、使わないかです。
私はbinaryを使うほうがラクでした。chromedriver-binaryを使う方法と使わない方法、順番に解説していきます。
動作環境
- CentOS7 さくらのVPS
- メモリ 512 MB
- ストレージ SSD 25 GB
- CPU 1コア
- Python 3.6.8
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
次に、パージョンを確認します。
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
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を使わない方法
流れは以下のとおりです。
binaryを使う時とほぼ同じですが、2と4番目が少し違うので、そこだけ解説します。
- GoogleChromeをインストール
- ChromeDriverのインストール
- Seleniumをインストール
- 実際のプログラムにインポートする
ChromeDriverのインストール
chromedriver-binaryをインストールする代わりに、ChromeDriverをインストールします。
ChromeDriver – WebDriver for Chromeというサイトに行き、インストールしたGoogleChromeと同じバージョンをクリック。
zipファイルが表示されます。
ダウンロードするのにURLが必要なので、Linux版のリンクアドレスをコピー。
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ありなしの解説記事はたぶん無かったので、参考になれば幸いです。
Seleniumに限らず、スクレイピングをもっと勉強したい方は、以下の書籍でより深く勉強できますよ。
参考
コメント