いつかスクレイピングに挑戦した時のこと。。。
準備
さて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_binary
はchrome 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で開発しているので一から導入しないといけなく、そこらへんでめちゃくちゃ詰まったお話。
でたエラーは全部載せたと思うので、同じと子で詰まった人が検索でたどり着いて解決したら嬉しいかな^^
コメント