こんにちは、はるです。
centOS8でChromeDriverのエラーと戦い、解決したのでまとめていきます。
結論を言ってしまうと、オプションを追加します。
なので、事前にオプションをインポートしておきます。
from selenium.webdriver.chrome.options import Options
options = Options()
動作環境
- さくらのVPS CentOS8
- Python 3.8.3
ChromeDriverのエラーまとめ
私が戦ったエラーは以下の2つです。
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
selenium.common.exceptions.WebDriverException: Message: unknown error: no chrome binary at /opt/scripts/google-chrome
ちなみに、どちらのエラーにも以下のエラーも発生していました。
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
「プロセスはもう実行されていないので、ChromeDriverはChromeがクラッシュしたとみなしています」
unknown error: Chrome failed to start: exited abnormally.
日本語訳すると、
「不明なエラーです。Chromeの起動に失敗しました。異常終了。」
調べまくったところ、オプションの
options.add_argument('--headless')
と
options.add_argument("--no-sandbox")
を追加すれば大丈夫みたいでした。
参考
AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする
head を haed と間違えないようにしましょう。
私はこのスペルミスで、30分ほど時間を失いました笑
unknown error: Chrome failed to start: exited abnormally.と同時に
(chrome not reachable)
または
(unknown error: DevToolsActivePort file doesn’t exist)
が出てくると思います。
その場合は、以下のようにどちらかを追加すればOK。
- (chrome not reachable) → –no-sandboxを追加
- (unknown error: DevToolsActivePort file doesn’t exist) → –headlessを追加
unknown error: no chrome binary at /opt/scripts/google-chrome
日本語訳すると、
「不明なエラーです。/opt/scripts/google-chrome にクロームのバイナリがありません。」
バイナリがないとのことなので、インポートします。
import chromedriver_binary
次にオプションで、googlechromeの場所を指定してあげます。
which google-chromeとコマンドを打つと、プログラムの実行パスが出てきます。
which google-chrome
/usr/bin/google-chrome
それを、binary_locationとして指定します。
options.binary_location = '/usr/bin/google-chrome'
options.binary_locationは、無くても動きました。
import chromedriver_binaryとなっていれば、大丈夫そうです。
その他のオプションについて
以下のオプションを追加しても効果はありませんでした。
# options.add_argument('--disable-dev-shm-usage')
# options.add_argument('--user-data-dir=user')
# options.add_argument('--profile-directory=profile')
# options.add_argument('--single-process')
# options.add_argument('--disable-application-cache')
# options.add_argument('--ignore-certificate-errors')
# options.add_argument('--start-maximized')
追加したコード
今回追加したコードをまとめます。
from selenium.webdriver.chrome.options import Options
options = Options()
#追記のとおり、options.binary_locationは不要でした。
#options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument("--no-sandbox")
#Google検索をする
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
driver.save_screenshot('search_results.png')
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()
以上、参考になれば幸いです。
CentOSでChromeDriver、GoogleChrome、Seleniumを使ってスクレイピングしたい!方がいましたら、こちらの記事も参考になると思います。
Pythonの関連記事
pythonのwebスクレイピングで得た値をLINEに通知する方法
PythonでWordPressに自動ログインする方法を解説
コメント