【Python】スクレイピングに必要なChromeDriverのインストールあれこれ

いつかスクレイピングに挑戦した時のこと。。。

準備

さてPythonでスクレイピングやるか!
まず作業スペースを作って起動

# Dockerfile
FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
# docker-compose.yml
version: "3.4"
services:
  python3:
    build: .
    tty: true
    volumes:
      - ./volume:/boot

docker-composeのインストールなど→こちら

$ docker-compose up

seleneを試す

どうやらseleneを使うといいらしい

$ pip install selene

とりあえずGoogle開いてみるか

from selene.browsers import BrowserName
from selene.api import *

if __name__ == '__main__':
    config.browser_name = BrowserName.CHROME
    browser.open_url('google.com')

実行!
ん?コピペのはずなんだけど何が悪いんだろう

$ python Main.py

  File "Main.py", line 13, in <module>
    from selene.browsers import BrowserName
ModuleNotFoundError: No module named 'selene.browsers'

どうやらこれでインストールするといいらしい。。。?

$ pip install git+https://github.com/yashaka/selene.git

再度実行!
google-chromeがないらしい、そこらへんの設定は勝手にやってくれるから
seleneを選んだのにどういうことだろう。。。

$ python Main.py

Traceback (most recent call last):
  File "Main.py", line 84, in <module>
    browser.open_url('google.com')
  File "/usr/local/lib/python3.7/site-packages/selene/browser.py", line 55, in open_url
    driver().get(base_url + absolute_or_relative_url)
  File "/usr/local/lib/python3.7/site-packages/selene/browser.py", line 35, in driver
    return selene.factory.ensure_driver_started(selene.config.browser_name)
  File "/usr/local/lib/python3.7/site-packages/selene/factory.py", line 60, in ensure_driver_started
    return _start_driver(name)
  File "/usr/local/lib/python3.7/site-packages/selene/factory.py", line 92, in _start_driver
    driver = __get_driver(name)
  File "/usr/local/lib/python3.7/site-packages/selene/factory.py", line 85, in __get_driver
    return __start_chrome()
  File "/usr/local/lib/python3.7/site-packages/selene/factory.py", line 67, in __start_chrome
    return webdriver.Chrome(executable_path=ChromeDriverManager().install(),
  File "/usr/local/lib/python3.7/site-packages/webdriver_manager/chrome.py", line 19, in install
    bin_file = self._file_manager.download_driver(self.driver, path)
  File "/usr/local/lib/python3.7/site-packages/webdriver_manager/cache.py", line 72, in download_driver
    cached_binary = self.get_cached_binary(driver, path, subpath)
  File "/usr/local/lib/python3.7/site-packages/webdriver_manager/cache.py", line 38, in get_cached_binary
    version = driver.get_version()
  File "/usr/local/lib/python3.7/site-packages/webdriver_manager/driver.py", line 34, in get_version
    return self.get_latest_release_version()
  File "/usr/local/lib/python3.7/site-packages/webdriver_manager/driver.py", line 50, in get_latest_release_version
    self.config.driver_latest_release_url + '_' + chrome_version()
  File "/usr/local/lib/python3.7/site-packages/webdriver_manager/utils.py", line 62, in chrome_version
    'Could not get version for Chrome with this command: {}'.format(cmd)
ValueError: Could not get version for Chrome with this command: google-chrome --version

seleniumを試す

自動でドライバーの設定やってくれないようなんでseleniumを使う

ドライバー周りをインストールしてっと
chromedriver_binarychrome driverのパスを勝手に通してくれる

$ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
$ sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
$ apt-get update
$ apt-get install google-chrome-stable
$ pip install chromedriver_binary

タイトル表示の最低限コードを書いて

import chromedriver_binary
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def main():
    options = Options()
    options.add_argument('--headless')
    options.add_argument('disable-infobars')
    options.add_argument('--no-sandbox')
    driver = webdriver.Chrome(chrome_options=options)
    driver.get('https://google.com')
    print(driver.title)
    driver.quit()

if __name__ == '__main__':
    main()

動かす

$ python Main.py
...
selenium.common.exceptions.WebDriverException: Message: session not created: This version of ChromeDriver only supports Chrome version 76
  (Driver info: chromedriver=76.0.3809.68 (420c9498db8ce8fcd190a954d51297672c1515d5-refs/branch-heads/3809@{#864}),platform=Linux 4.9.125-linuxkit x86_64)

今度はなんだし!

ChromeDriverとChromeのバージョンがあっていないといけないらしい
google-chrome-stable(75)じゃなくてgoogle-chrome-beta(76)を使うことで76系(記事編集時)
に揃えられるようなのでとりあえずそうしよう。

※多分バージョン指定してダウンロードできる

$ apt-get remove google-chrome-stable
$ apt-get install google-chrome-beta

今度こそうまくいってくれ

$ python Main.py
Google

はい、やっとタイトル表示まで行けた^^

普段ならローカルで開発するからChromeが元からあって追加のインストールなどしないが、
今回はdockerで開発しているので一から導入しないといけなく、そこらへんでめちゃくちゃ詰まったお話。

でたエラーは全部載せたと思うので、同じと子で詰まった人が検索でたどり着いて解決したら嬉しいかな^^

コメント

タイトルとURLをコピーしました