Chapter 08

ECS AWS Linux スクレイピング 設定

hello_yogurt
hello_yogurt
2022.07.23に更新

LinuxでChromeDriverを使う場合、ローカルのままでやると絶対エラー出る。
単純にChromeDriver(linux)してもエラー出るので、設定が必要。

多分、ローカルのままで、ChromeDriver(linux)だけ変えても以下のエラーが出る

selenium.common.exceptions.WebDriverException: Message: Service /tmp/bin/chromedriver unexpectedly exited. Status code was: 127


解決
WebDriverExceptionの直し方

https://2020.seiichiyonezawa.com/2020/07/08/how-to-fix-webdriverexception.html

・chromedriver --versionで起動すると必要なライブラリが足りていないというエラーが表示されるので、それをもとにapt-cache searchで探してみる
・これをDockerで立ち上げて、ライブラリを確認する
・最終的にchromedriverのバージョンが出れば完了

多分、次にこのエラーが出る

selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary


解決
linuxにChromeをインストールすればいい

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
apt install  --fix-broken ./google-chrome-stable_current_amd64.deb -y

ググってもLambdaのSeleniumしか出てこない(EC2やECSの設定は全然ない)
なので、今回ECSの設定を書いた。(ECSというか、Amazon Linuxでの設定です)

必要なライブラリを事前にインストールしないといけない。
しかも、何をインストールするかも自分でdocker使って調べなきゃいけない。
(ググっても出てこないです。公式にも載ってないし)

あと、Chromeをlinuxにインストールする必要あり。
chromiumだと動かない。

結論を先に。
Dockerfileは以下。

Dockerfile_backend
FROM python:3.7-buster as builder

ENV PYTHONUNBUFFERED 1

WORKDIR /code

COPY /backend/requirements.lock /code
RUN pip install --upgrade pip \
  && pip install -r /code/requirements.lock


FROM python:3.7-slim-buster as runner

COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages
COPY --from=builder /usr/local/bin/uwsgi /usr/local/bin/uwsgi


RUN apt update \
  && apt-get -y install default-libmysqlclient-dev -y wget \
  && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
  && apt install  --fix-broken ./google-chrome-stable_current_amd64.deb -y \
  && apt install -y libxml2 libglibd-2.0-0 -y libnss3 -y libxcb1 \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

RUN useradd -r -s /bin/false uwsgiusr
RUN mkdir -p code/src/logs/app_logs
RUN touch code/src/logs/server.log
RUN chown -R uwsgiusr code/src/logs

USER uwsgiusr

COPY /backend /code
COPY /backend/bin /var/task/bin/

CMD uwsgi --ini /code/deploy/uwsgi.ini

大事な部分は以下

RUN apt update \
  && apt-get -y install default-libmysqlclient-dev -y wget \
  && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
  && apt install  --fix-broken ./google-chrome-stable_current_amd64.deb -y \
  && apt install -y libxml2 libglibd-2.0-0 -y libnss3 -y libxcb1 \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

Chromeのインストールは以下

apt-get -y install default-libmysqlclient-dev -y wget \
  && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

必要なライブラリは以下(自分の場合)
libxml2 libglibd-2.0-0 -y libnss3 -y libxcb1

確認方法は実際にDockerで立ち上げて(コンテナ中に入って)、chromedriver --versionして、エラー文を見る

立ち上げコマンド

docker run   --name backend  -it -p 8000:8000 backend
docker run   --name backend  -d backend

コンテナ入るコマンド

docker exec -it [コンテナ名] /bin/bash
docker exec -it backend /bin/bash
docker exec -it frontend /bin/ash


エラーの時は手入力したほうがいい

一応、その時のコマンド(結局、chromedriverを動かすための設定です)

apt-get update
apt-get install curl
curl -O https://chromedriver.storage.googleapis.com/103.0.5060.53/chromedriver_linux64.zip
apt install unzip
unzip chromedriver_linux64.zip
mv chromedriver /usr/local/bin/
rm chromedriver_linux64.zip
apt-get install libglibd-2.0-0
apt-get install -y libnss3
apt-get install -y libxcb1
chromedriver --version出た
ChromeDriver 103.0.5060.53 (a1711811edd74ff1cf2150f36ffa3b0dae40b17f-refs/branch-heads/5060@{#853})

ライブラリインストールしろのエラー

chromedriver: error while loading shared libraries: libglib-2.0.so.0: cannot open shared object file: No such file or directory

chromedriver: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory

chromedriver: error while loading shared libraries: libxcb.so.1: cannot open shared object file: No such file or directory

その他のエラー

WebDriverException: unknown error: cannot find Chrome binary
解決
↓
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
apt install  --fix-broken ./google-chrome-stable_current_amd64.deb -y

【スクレイピング】DockerコンテナにSeleniumをインストールしてブラウザ操作
https://melheaven.hatenadiary.jp/entry/selenium