Yoshi.dev

技術系の趣味、またはやった仕事やそこから学んだことを忘れないために

Node.jsで作ったスクレイピングアプリをDockerコンテナで起動してみた

(qiitaにも書いたけどこっちにも載せとこう...)

やりたかったこと

  • サーバーレス環境でスクレイピングアプリを動かしたかった
  • Knative試したかったのでコンテナ化する必要があった

nodejsでスクレイピングするアプリをサクッと作る

まずは好きなところにディレクトリ切って下記コマンドを叩く
npm init
出てくる質問は全てEnter連打した
次にスクレイピングに必要な selenium-webdriver をインストール
https://www.npmjs.com/package/selenium-webdriver

npm install selenium-webdriver

scrapingするプログラムを書いていきます。今回はgoogle chromeが既にインストールされている前提で話を進めます。

vim example.js

const { Builder, By, Capabilities } = require('selenium-webdriver');

const capabilities = Capabilities.chrome();
capabilities.set('chromeOptions', {
  args: [
    '--headless',
    '--no-sandbox',
    '--disable-gpu',
    '--window-size=1980,1200',
    // other chrome options
  ],
});

(async function example() {
  console.log('start google scraping');

  const driver = await new Builder().forBrowser('chrome').withCapabilities(capabilities).build();
  try {
    await driver.get('https://www.google.com/?hl=');

    const text = await driver.findElement(By.xpath('/html')).getText();
    console.log(text);
  } finally {
    await driver.quit();
    console.log('finish scraping');
  }
}());


const sleep = time => new Promise((resolve) => {
  setTimeout(() => {
    resolve();
  }, time);
});

puppeteerもサクッと立ち上げるのには良さそうだったけどブラウザがchromium縛りになるのが嫌だったので今回はWebdriver使いました

npm scriptsを定義する

package.json のscriptsに以下のようにstartタスクを追加します

"scripts": {
    "start": "node ./example.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

試しにスクレイピングを走らせてみます npm start

fuga@hoge ~/D/g/scraping-sample> npm start

> scraping-sample@1.0.0 start /Users/a12711/Documents/git-localrepository/scraping-sample
> node ./example.js

start google scraping
Gmail
画像
ログイン
日本
プライバシー規約設定
広告ビジネスGoogleについて
finish scraping

うまくスクレイピングが動いてそうです

Dockerfileを作る

今回はサクッと作りたかったので、seleniumのstandalone-chromeのイメージを元にして、nodejsをインストールするDockerfileを作成しました

FROM selenium/standalone-chrome:3.141.59 

WORKDIR /usr/src/app

COPY package*.json ./

USER root

RUN curl -SL https://deb.nodesource.com/setup_8.x | bash
RUN apt-get install -y nodejs

RUN npm install

COPY . .

CMD npm start

Docker Build

dockerが入っていない方はdocker desktop等でdocker入れてください

Dockerイメージを作成する docker build -t sample/robot .

コンテナ起動 docker run sample/robot

fuga@hoge ~/D/g/scraping-sample> docker run sample/robot

> scraping-sample@1.0.0 start /usr/src/app
> node ./example.js

start google scraping
Gmail
画像
ログイン
日本
プライバシー規約設定
広告ビジネスGoogleについて
finish scraping

先程と同様のログが出ています これでスクレイピングのアプリをDockerコンテナとして動かすことができました