Ruby

Docker+Selenium+Rubyでスクレイピング環境構築

インターネット回線費など固定費の領収書をDLするツールを作ろうと思い、Docker+Selenium+Rubyの環境構築をしたのでメモ。

Rubyにした理由は、久しくRubyを書いていないのでたまにはってだけ。

まだ完成していないですが、環境周りだけでも紹介します。

Dockerについて学びたい人は「【超厳選】UdemyでDockerを学べるおすすめ講座2選」がオススメ!!

作るもののイメージ

docker起動させてbashで入って領収書DLしたいサービスを指定してプログラムを実行する。

$ docker-compose exec [コンテナ名] bash
// ↓ここからDocker環境内
$ ruby ntt.rb 202101 // 2021/01のNTTの領収書DL
$ ruby mineo.rb 202101 202102 // 2021/01, 02 のマイネオを領収書DL

 

ファイル構成

- Dockerfile
- docker-compose.yml
- Gemfile
- Gemfile.lock
- downloads/ <- DLしたファイルをここに置く
- mineo.rb  <- DLしたいサービスごとに実行ファイル作る
- .env <- 環境変数

 

Gemfile

今の所これだけ。

# frozen_string_literal: true
source "https://rubygems.org"

gem "selenium-webdriver"

 

Dockerfile

FROM ruby:3.0.1

# chromedriveをDLして /usr/local/bin/ に置く
RUN wget https://chromedriver.storage.googleapis.com/91.0.4472.19/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip && rm chromedriver_linux64.zip
RUN mv chromedriver /usr/local/bin/
# chrome をinstall
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt update -y && apt install -y libnss3 google-chrome-stable

WORKDIR /app
# Chromeを動かすときにrootユーザーだと --no-sandboxオプションを指定する必要がある
# これを避けるためにユーザー作成し、docker-composeで capability SYS_ADMINを追加
RUN useradd -m developer && chown -R developer:developer /app
# 作成したユーザーを使う
USER developer

COPY Gemfile .
COPY Gemfile.lock .
RUN bundle install
COPY . /app
# docker環境に入って色々コマンド実行したいので CMDもENTRYPOINTもなし

 

コメント書いている通りですが、補足。

Chrome の WebDriver を使うときにrootユーザーだと --no-sandbox オプションを付けないと行けないのですが、サンドボックス(外部から受け取ったプログラムを保護された領域で動作させることで、プログラムの影響範囲を限定的にしてくれる機能)を無効しちゃうのは極力避けたい。

そのためにユーザーを作成して、作成したユーザーを使うようにしています。

 

 

docker-compose.yml

version: "3.8"
services:
  receipt:
    build: .
    container_name: receipt # コンテナ名
    volumes:
      - .:/app
    tty: true # コンテナを起動させ続けるため
    env_file:
      - .env
    cap_add:
      - SYS_ADMIN # Dockerfileで作成したユーザーでchrome起動するためにcapability SYS_ADMINを追加

 

.env にはログイン情報(ID / Password)を置く想定

 

こちらもオススメRails6, MySQL, alpineでローカル環境のDocker構築

Dockerについて学びたい人は「【超厳選】UdemyでDockerを学べるおすすめ講座2選」がオススメ!!

 

-Ruby

© 2021 フリエン生活 Powered by AFFINGER5