RubyでPORTAから書誌データを取ってくる
Ruby を使って、国立国会図書館の PORTA から書誌データを取得してみます。今回は ISBN の指定による検索を行いたいので、Z39.50 インターフェースを利用します*1。
まず、Ruby のライブラリである zoom と isbn-tools をインストールします。
$ sudo gem install zoom $ sudo gem install isbn-tools
次に以下の内容のスクリプトを作り、適当な名前で保存します(とりあえず porta.rb とします)。なお、このスクリプトは"How to Find Free MARC Records with Ruby"に掲載されているものを、ほぼそのまま使わせていただいています。
#!/usr/bin/ruby -w # This script was originally written by William Denton # http://www.miskatonic.org/library/zmarc.html require 'rubygems' require 'zoom' require 'isbn/tools' if ARGV.length == 0 puts "Please specify an ISBN" exit 0 end isbn = ARGV[0] isbn = isbn.gsub(/[^0-9X]/, '') unless ISBN_Tools.is_valid?(isbn) puts "This is not a valid ISBN" exit 0 end # NDL蔵書目録(zomoku)を対象にする # その他のデータベース名はPORTAの仕様書を参照 server = ['api.porta.ndl.go.jp', 210, 'zomoku'] def z3950query (isbn, host, port, db) begin ZOOM::Connection.open(host, port) do |conn| conn.database_name = db # PORTAでのZ39.50のデータ返戻形式はSUTRSのみ # サーバによってはMARCXMLなどが指定できる conn.preferred_record_syntax = 'SUTRS' # USE(検索項目)アトリビュート(Type-1)の値に7(ISBN)を指定 # 検索項目の対応表はPORTAの仕様書を参照 rset = conn.search("@attr 1=7 #{isbn}") return rset[0] end rescue Exception => e # puts e # Uncomment to see any server errors return nil end end puts "#{server[0]} ..." result = z3950query(isbn, server[0], server[1], server[2]) # PORTA上の書誌データのISBNが10桁の場合、10桁で入力しないと # ヒットしない。13桁の場合も同様 # このため、検索結果が空だった場合、10桁で入力されたISBNを13桁に、 # 13桁で入力されたISBNを10桁に変換してもう一度検索する if result.nil? if isbn.length == 10 isbn = ISBN_Tools.isbn10_to_isbn13(isbn) elsif isbn.length == 13 isbn = ISBN_Tools.isbn13_to_isbn10(isbn) end result = z3950query(isbn, server[0], server[1], server[2]) end unless result.nil? puts result exit 1 end puts "Sorry, nothing found" exit 0
このスクリプトを ISBN を引数にして実行すると、以下のような出力が得られます。あとはこれを好きなように整形します。
$ ruby ./porta.rb 9784820403302 api.porta.ndl.go.jp ... 【title】:書誌レコードの機能要件 IFLA書誌レコード機能要件研究グループ最終報告(IFLA目録部会常任委員会承認) 和中幹雄,古川肇,永田治樹訳 【titleTranscription】:ショシ レコード ノ キノウ ヨウケン IFLA ショシ レコード キノウ ヨウケン ケンキュウ グループ サイシュウ ホウコク IFLA モクロク ブカイ ジョウニン イインカイ ショウニン 【alternative】:Functional requirements for bibliographic records:final report. 【creator】(dcndl:NDLNH):和中‖幹雄(1948−) 【creator】(dcndl:NDLNH):古川‖肇(図書館学) 【creator】(dcndl:NDLNH):永田‖治樹(1944−) 【creator】(dcndl:NDLNH):国際図書館連盟 【creatorTranscription】(dcndl:NDLNH):ワナカ,ミキオ(1948−) 【creatorTranscription】(dcndl:NDLNH):フルカワ,ハジメ(図書館学) 【creatorTranscription】(dcndl:NDLNH):ナガタ,ハルキ(1944−) 【creatorTranscription】(dcndl:NDLNH):コクサイ トショカン レンメイ 【subject】(dcndl:NDLNH):目録法 【subject】(dcndl:NDC):014.3 【subject】(dcndl:NDLC):UL631 【subjectTranscription】(dcndl:NDLNH):モクロクホウ 【description】:121p 30cm 【publisher】:日本図書館協会 【issued】:2004.3 【issued】(dcterms:W3CDTF):2004 【identifier】(dcterms:URI):http://api.porta.ndl.go.jp/ndlopac/cgi-bin/ndlopac/ndl-book?kywd=20565544 【identifier】(dcndl:ISBN):4-8204-0330-3 【identifier】(dcndl:JPNO):20565544 【identifier】(dcndl_porta:NDLCN):UL631−H9 【language】(dcterms:ISO639-2):JPN 【dpid】:zomoku 【repository_no】:R000000001 【item_no】:I000562723
*1:OpenSearchでもISBN指定での検索をできるようにしてほしいなあ。