NodeJSで地獄のミサワの画像をスクレイピングする

休日暇だったからやった。後悔はしていない。


domに対してqueryを投げるのは jsdom を使った。他にも選択肢はあるみたいだが、domと同じ機能を気軽に使えそうなライブラリがこれだったので採用した。

nodejsの http(s)fs をちゃんと使ったのよく考えたら初めてかもしれない。思ったよりも使い勝手が良かったので良き。

http://blog.livedoor.jp/jigokuno_misawaに迷惑をかけてはいけないので3sごとのrequstにしている。

const fs = require('fs');
const http = require('http');
const https = require('https');
const { JSDOM } = require("jsdom");

const base_url = "http://blog.livedoor.jp/jigokuno_misawa/?p=";

const cb = body => {
    const dom = new JSDOM(body);
    dom.window.document.querySelectorAll(".article-body-inner img")
        .forEach(img => handleHttpFile(img.src, `./img/${img.alt}.png`));
};

const handleHttpFile = (url, output) => {
    const file = fs.createWriteStream(output);
    https.get(url, res => {
        res.pipe(file);
        res.on('end', () => file.close());
    }).on('error', e => console.log(e.message));
};

const handleHttpGet = url =>{
    http.get(url, res => {
        let body = '';
        res.setEncoding('utf8');
        res.on('data', chunk => body += chunk);
        res.on('end', _ => cb(body));
    }).on('error', e => console.log(e.message));
};

for (let index = 0; index < 213; index++) {
    setTimeout(() => handleHttpGet(`${base_url}${index}`), index * 3000);
}

結果はこんな感じ