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コンテナとして動かすことができました