画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

node.jsでrequestを使ってeuc-jpのサイトをスクレイピング時にハマった事

node.jsでeuc-jpのサイトをスクレイピングしようとしたらハマった。 文字コードを指定して変換したつもりだけど、文字化けしまくってた。

ダメな例

var request = require('request');
var Iconv = require('iconv').Iconv;
var fs = require('fs');
request('http://hoge.jp', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE');
    body = iconv.convert(body).toString();
    fs.writeFile('hoge.txt', body);
  }
});

良い例

var request = require('request');
var Iconv = require('iconv').Iconv;
var fs = require('fs');
request({url: 'http://hoge.jp', encoding: null }, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var iconv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE');
    body = iconv.convert(body).toString();
    fs.writeFile('hoge.txt', body);
  }
});

文字コードを明確にnullを指定しないと、requestのモジュール内で勝手にbody.toString()とよしなに変換してくれようとするのです!

https://github.com/request/request/blob/5d515b04331b445144e625d9abc6e74b5a72722f/request.js#L1248-L1254

この辺。

ってか、参考サイトそのままコピペしたようなコードになっておる。。。

地味にハマりました。。。(泣)

thanks