読者です 読者をやめる 読者になる 読者になる

鴨川にあこがれる日々

軽い技術っぽい記事かいてます

NDLの「全国書誌(作成完了書誌)」を取得

要点

NDLの全国書誌一覧を使って情報量を増やしたjson形式のデータを取得するスクリプトを書きました.

はじめに

私は,本のデータが欲しいことがあります.
(MLのアルゴリズムを試す,最近出版された図書が気になる...など)

まずは図書館が配信しているRSSAPIで取得可能な資源を思いつきます.

国立国会図書館は全国書誌をRSSを配信していますので,それを少し工夫して取得してみようかと思います.
全国書誌データ提供|国立国会図書館―National Diet Library

また更新がない日(休館日など)は,最新分が更新されませんのでcronを使う場合はご注意ください.

環境

  • ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]
  • nokogiri 1.6.6.2
  • json 1.8.2

本題

見たことがある方は同感していただけるかもしれませんが,
RSSにある情報だけではかなり情報量に乏しいので書籍をNDLサーチで検索したページからjson形式のデータ*1を取得します.

幸いにしてjsonページはRSSで取得できるリンクに".json"を加えるだけなので,簡単です.

一部のフィールドを抽出してみます.

require 'uri'
require 'net/http'
require 'open-uri'
require 'nokogiri'
require 'json'

url = "http://iss.ndl.go.jp/rss/ndlopac/index.xml"
xml = open(url)
list = Nokogiri::XML(xml)
book_link = []

# 図書のリンクに".json"を付与したものを格納
list.xpath("//link").each do |link| 
  link_text = link.text
  book_link << link_text+".json" if link_text =~ /.+books/
end

# json1つ1つを展開
book_link.each do |book|
  uri = URI.parse(book)
  json = Net::HTTP.get(uri)
  result = JSON.parse(json)

  puts result["identifier"]["ISBN"]
  result["title"].each do |elem|
    puts elem["value"]
  end
  result["publisher"].each do |elem|
    puts elem["name"]
    puts elem["location"]
  end

  puts result["date"]
  puts result["subject"]["NDC9"]
  puts result["price"]
  puts result["materialType"]
end

最初の図書だけを出力すると

978-4-07-297744-6
おいもさえあれば!ごぼう、れんこんさえあれば!100レシピ
主婦の友社
東京
2014.10
596
470円
図書

となります

おわりに

さすがNDL様です.
毎日更新なので,cronに1日1回実行すれば自動化もできますね.

*1:LISP (培風館): 1982|書誌詳細|国立国会図書館サーチ これの右下にある「書誌情報をJSONで出力」です