RubyでISBNから書籍情報を取得してみた

#はじめに
ISBNコードを入力して漫画のタイトルや著者などを取得できると便利そうだと思い作ってみました。
Rubyで開発をした理由は、あまり触ったことのない言語だったので勉強を兼ねてです。

#開発の方針を決める
コーディングする前にざっくりと開発方針を決める。
これを決めないとグダグダになってしまうので...

- やりたいこと
 ISBNコードの入力に対して、書籍のタイトル、著者、出版社、レーベルを取得する。

- 開発環境
 言語：Ruby
 環境：Paiza IO(ちょっとしたプログラムは十分動くので便利)

#国立国会図書館のサーチAPIを使ってみる
ISBNから書籍の情報を取得するために、国立国会図書館のサーチAPIを使用しました。
とりあえずRubyで書籍情報を取得してみます。

``` ruby:GetBook.rb
require 'net/http'
require 'uri'

isbn = "9784781615691"
uri = "http://iss.ndl.go.jp/api/opensearch?isbn=" + isbn

targ_uri = URI.parse(uri)
@get_data = Net::HTTP::get(targ_uri)
print(@get_data)
```

このコードで、指定したisbn(今回は"9784781615691")の書籍情報をxml形式で取得できます。

``` xml:get_data.xml
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" version="2.0" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcndl="http://ndl.go.jp/dcndl/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <channel>
    <title>9784781615691 - 国立国会図書館サーチ OpenSearch</title>
    <link>http://iss.ndl.go.jp/api/opensearch?isbn=9784781615691</link>
    <description>Search results for isbn=9784781615691 </description>
    <language>ja</language>
    <openSearch:totalResults>1</openSearch:totalResults>
    <openSearch:startIndex>1</openSearch:startIndex>
    <openSearch:itemsPerPage></openSearch:itemsPerPage>
    <item>
      <title>スペクトラルウィザード = SPECTRAL WIZARD</title>
      <link>http://iss.ndl.go.jp/books/R100000002-I028387185-00</link>
<description>
<![CDATA[<p>イースト・プレス,9784781615691</p>
<ul><li>タイトル： スペクトラルウィザード = SPECTRAL WIZARD</li>
<li>タイトル（読み）： スペクトラル ウィザード</li>
<li>責任表示： 模造クリスタル 著,</li>
<li>NDC(10)： 726.1</li>
<li>NDC(9)： 726.1</li>
</ul>]]>
</description>
      <author>模造クリスタル 著,模造クリスタル,</author>
      <category>本</category>
      <guid isPermaLink="true">http://iss.ndl.go.jp/books/R100000002-I028387185-00</guid>
      <pubDate>Tue, 22 Aug 2017 09:00:00 +0900</pubDate>
      <dc:title>スペクトラルウィザード = SPECTRAL WIZARD</dc:title>
      <dcndl:titleTranscription>スペクトラル ウィザード</dcndl:titleTranscription>
      <dc:creator>模造クリスタル</dc:creator>
      <dcndl:creatorTranscription>モゾウ クリスタル</dcndl:creatorTranscription>
      <dc:publisher>イースト・プレス</dc:publisher>
      <dcterms:issued xsi:type="dcterms:W3CDTF">2017</dcterms:issued>
      <dcndl:price>800円</dcndl:price>
      <dc:extent>238p ; 19cm</dc:extent>
      <dc:identifier xsi:type="dcndl:ISBN">9784781615691</dc:identifier>
      <dc:identifier xsi:type="dcndl:NDLBibID">028387185</dc:identifier>
      <dc:identifier xsi:type="dcndl:JPNO">22930407</dc:identifier>
      <dc:identifier xsi:type="dcndl:TOHANMARCNO">33641327</dc:identifier>
      <dc:subject xsi:type="dcndl:NDLC">Y84</dc:subject>
      <dc:subject xsi:type="dcndl:NDC10">726.1</dc:subject>
      <dc:subject xsi:type="dcndl:NDC9">726.1</dc:subject>
      <dc:description>NDC（9版）はNDC（10版）を自動変換した値である。</dc:description>
      <rdfs:seeAlso rdf:resource="http://id.ndl.go.jp/bib/028387185"/>
    </item>
  </channel>
</rss>
```

取得したxmlは上記のような構造になっています。

#取得したXMLをパース(解析)する
次に、APIで取得したXMLから必要な情報を抜き取ります。
今回は書籍のタイトル、著者、出版社、レーベルを取得します。

``` ruby:XmlParse.rb
#get_data -> "GetBook.rb"で取得したxmlになります。
xml_data = REXML::Document.new(get_data)

print("作者　　: "+xml_data.elements["rss/channel/item/dc:creator"].text+"\n")
print("タイトル: "+xml_data.elements["rss/channel/item/dc:title"].text+"\n")
print("出版社　: "+xml_data.elements["rss/channel/item/dc:publisher"].text+"\n")
print("レーベル: "+xml_data.elements["rss/channel/item/dcndl:seriesTitle"].text+"\n")

# *out*
# 作者　　: 模造クリスタル
# タイトル: 黒き淀みのヘドロさん = Kraunessa the Black Stagne
# 出版社　: KADOKAWA
# レーベル: it COMICS

```

このようにxml_data.elements["取得したい要素のパス"].text で取得したい要素をテキスト形式で取得することができます。
要素のパスを変えることで取得内容を変更できるのでいろいろ試してみると面白いかもしれないです。

#さいごに
今回はisbn入力に対して書籍の情報を取得してみました。
細かい部分を指摘すると、apiで取得できなかった場合のnilチェックなどをしなくてわいけないのですが、今回は割愛ということで,,,