追記
ajido@githubさんにコメント頂き、HTML5のケースに対応して修正しました。ありがとうございます!
Node.jsでスクレイピングをしようとしたところ、文字コードを判定、変換する必要に迫られました。
そこで取得したWebページの文字コードを自動で識別し、UTF-8へ変換するようにしました。
CoffeeScriptで書いてます。
Requirements
以下の npm パッケージが必要です。
- iconv
- buffer
- request
- cheerio
文字コードの識別・変換
取得したWebページのmetaタグから文字コードを取得し、IconvでUTF-8へ変換します。
エラー処理などは特に意識していません。
charset.coffee
{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')
スクレイピングは夢が広がります:)