cheerioを使ってクローラを作る

Node.js でクローラ

ちょっとクローラが必要になった。相当前にpythonで書いた覚えがあるけれど、今回はちょうどnode.jsの環境が手元にあるのでそれでやる。

jsdom を使うと、jQueryでいろいろできて便利そうなので、jsdomをnpm install しようと試してみた。
が、node-gypというのに依存しているらしく、こいつの動作には「Microsoft Visual Studio C++ 2012 for Windows Desktop (Express version works well)」が必要みたいで、ちょっと面倒そうなのでやめた。

cheerio を採用

調べてみると、cheerioというのでも、同じことが実現できるそうで、これを使うことにした。
あと、同期的に書きたいので、前の記事 で使ったfibrous も使う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var request = require('request');
var cheerio = require('cheerio');
var fibrous = require('fibrous');
var fs = require('fs');
function sleep(ms, cb){
setTimeout(function(){
cb(null);
}, ms);
}
var requestUrl = 'http://hogehoge';
fibrous.run(function(){
var res = request.sync({url: requestUrl});
$ = cheerio.load(res.body);
$('img').each(function(i){ // 例えば、画像を全部DLする
var src = $(this).attr('src');
request(requestUrl + src).pipe(fs.createWriteStream('download/' + i + '.png')); //適当なファイル名に書き出し
sleep.sync(5000 + Math.random() * 5000); //大量にアクセスいくのもあれなので、適当に時間間隔を設けてみる。
});
});