Node.jsで、取得したWebページをUTF-8へ自動変換する
Node.jsでスクレイピングをしようとしたところ、文字コードを判定、変換する必要に迫られました。 そこで取得したWebページの文字コードを自動で識別し、UTF-8へ変換するようにしました。 CoffeeScriptで書いてます。
Requirements
以下の npm パッケージが必要です。
- iconv
- buffer
- request
- cheerio
文字コードの識別・変換
取得したWebページのmetaタグから文字コードを取得し、IconvでUTF-8へ変換します。 エラー処理などは特に意識していません。
{Iconv} = require "iconv" {Buffer} = require "buffer" # エンコーディングの判別 getCharset = (body) -> bin = body.toString('binary') re = bin.match(/<meta\b[^>]*charset=([\w\-]+)/i) if re charset = re[1] else charset = "utf-8" charset # エンコーディングをUTF-8へ変換 toUtf8 = (body) -> iconv = new Iconv(getCharset(body), 'UTF-8//TRANSLIT//IGNORE') body = new Buffer(body, 'binary') body = iconv.convert(body).toString() module.exports = toUtf8: toUtf8
いざスクレイピング
上記のコードをcharset.coffeeとして保存します。 requestで取得したWebページをcharset.toUtf8へ渡すと、UTF-8へ変換します あとはcheerioで好きにスクレイピングができます。
request = require "request" cheerio = require "cheerio" charset = require "charset" # 指定URLを処理する processPage = (url) -> request uri: url encoding: "binary" , scrapingPage # 取得したページをスクレイピングする scrapingPage = (error, response, body) -> if not error and response.statusCode is 200 # UTF-8へ変換 $ = cheerio.load(charset.toUtf8(body)) # # 好きなスクレイピング ... # # 実行 processPage('http://www.jma.go.jp/jma/index.html')
スクレイピングは夢が広がりますね :)