J-STAGE APIで論文を検索する
J-STAGE(科学技術振興機構が運営する電子ジャーナルプラットフォーム)は、国内の学協会誌を中心に600万本規模の論文を公開しており、その検索がWebAPIとして開放されています。APIキーの登録も不要で、論文タイトル・著者・キーワードから書誌情報とDOI、本文リンクまで一度に引けるため、研究データを扱うアプリケーションの土台として使いやすいAPIです。ただしレスポンスはJSONではなくXMLで、しかも「エラーもHTTP 200で返る」「0件のはずが1件返る」といった、素直に実装すると必ず踏む癖があります。このガイドでは、何が取れるのかと、実際に叩いて確認した落とし穴を整理します。
J-STAGE APIで取れるデータ
APIは service パラメータで3つの機能に分かれています。service=1 は資料検索で、資料名・学協会名・ISSN・査読の有無・即時オープンアクセスのポリシー・APC(論文掲載料)の金額・収蔵範囲といった、雑誌そのものの情報が取れます。service=2 は巻号一覧で、ある資料の巻・号・発行年の一覧が返ります。service=3 は論文検索で、論文タイトル・著者名(和文と英文の両方)・巻号ページ・発行年・DOI・J-STAGE固有のID(JOI)・本文へのリンクURLが取れます。
実務で最もよく使うのは service=3 の論文検索でしょう。DOIが直接返ってくるため、他の文献データベースとの突き合わせや、被引用の追跡につなげやすいのが利点です。本文リンクも返るので、オープンアクセスの論文であればそのまま全文に到達できます。
APIキーの登録は不要で、そのまま叩けます。ただし利用条件には注意が必要です(後述)。
APIの叩き方とパラメータ
エンドポイントは `https://api.jstage.jst.go.jp/searchapi/do` です。service で機能を選び、あとは検索条件のパラメータを付けます。論文検索(service=3)で使える主なパラメータは、article(論文タイトル)、material(資料名)、author(著者名)、affil(所属)、keyword(キーワード)、abst(抄録)、text(本文)、issn、cdjournal(資料コード)、vol、no、pubyearfrom / pubyearto(発行年の範囲。西暦4桁)、start(取得開始位置)、count(取得件数)です。
検索語は基本的に中間一致で、大文字小文字や全角半角は区別されません。ただし issn だけは例外で、XXXX-XXXX 形式の完全一致です。ページングは start と count の組み合わせで行い、1回のリクエストで取得できるのは最大1000件までとされています。
リクエスト・レスポンスとも文字コードはUTF-8です。日本語のタイトルや著者名も、そのまま扱えます。
レスポンスはJSONではなくXML
J-STAGE APIのレスポンスはXMLです。しかも単純な独自XMLではなく、Atom(フィード形式)・OpenSearch(検索結果のメタ情報)・PRISM(出版物のメタデータ)という3つの名前空間が混在した構造になっています。JSONを期待して実装すると最初のパースで詰まるので、XMLパーサーを用意してください。
全体は feed 要素で、その中に result(処理結果のステータス)、opensearch:totalResults(総ヒット件数)、そして検索結果1件ごとの entry 要素が並びます。論文タイトルは article_title の下に ja / en で入れ子になっており、DOIは prism:doi に入ります。名前空間つきのタグを引く必要があるため、名前空間を無視する雑なパースをすると値が取れません。
実装で必ず踏む3つの落とし穴
1つ目、そして最も危険なのが「0件ヒットなのに entry が1件返る」ことです。存在しない語で検索すると、opensearch:totalResults は空(0ではなく空文字)になり、さらに中身が全部空の entry 要素が1つだけ返ってきます。つまり「entry要素の数=ヒット件数」として実装すると、0件のはずが常に1件ヒットしたことになります。空のレコードがそのまま後続処理に流れるため、タイトルが空文字の論文が混ざる、といった形で表面化します。
2つ目は、エラーもHTTP 200で返ることです。J-STAGE APIはエラー時もHTTPステータスコードで異常を通知しません。判定はXML内の result/status タグを見るしかなく、HTTPステータスでの分岐は使えません。ステータス値には ERR_001(該当0件)、ERR_003(同時アクセス数の制限超過)、ERR_004(無効なパラメータ値)、ERR_005(必須項目未指定)、ERR_006(発行年が4桁数値でない)、ERR_007(start/countが数値でない)、ERR_008(ISSN形式不正)、ERR_012(論文検索で検索語が一つも指定されていない)などがあります。
3つ目は、そのステータスに「エラーではない値」が混ざることです。status には WARN_002 という値があり、これは「検索結果が上限件数を超えた」という警告ですが、データ自体は正常に返っています。実際に article=機械学習 で検索すると総ヒット3420件で WARN_002 が返りますが、entry は問題なく取得できます。「status が 0 以外なら例外」という実装にすると、正常に使える結果を握りつぶしてしまいます。エラーとして扱うべきは ERR_ / SYS_ERR_ で始まるもので、WARN_ は通してよい、という切り分けが要ります。
細かい点では、prism:issn がスペースだけで埋められて返ることがあります。「未設定なら空文字」と決め打ちして空判定すると、値があるものとして誤判定します。trim してから判定してください。
利用条件(営利利用は事前申請が必要)
APIキーは不要ですが、利用規約に重要な条件があります。非営利目的での利用はJSTへの申請が不要である一方、営利目的で利用する場合は、有償・無償にかかわらずJSTへの利用申請が必要と明記されています。商用サービスに組み込む場合は、実装より先に申請の要否を確認してください。
また規約では、機械的手段による大量ダウンロード、リバースエンジニアリング、過度な負荷をかける行為が禁止されています。アクセス回数や時間の制限を課す旨も規約に書かれていますが、具体的な数値(毎秒何回まで、同時接続数など)は公開されていません。ステータス ERR_003 が同時アクセス数の制限超過に対応するため、実装側では ERR_003 を受けたらバックオフして再試行する、といった作りにしておくのが安全です。
実際に叩いてみる(J-STAGE・登録不要)
J-STAGE の検索APIは登録不要で、service(3=論文検索)と text(検索語)を渡すと Atom(XML)形式で論文が返ります。feed 内の各 entry に論文のタイトル・著者・巻号・DOI等が入ります。JSONではなくXMLパースが必要です。
curl -s "https://api.jstage.jst.go.jp/searchapi/do?service=3&text=AI&count=1"
# 実際のレスポンス(抜粋・Atom/XML)
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
xmlns:prism="http://prismstandard.org/namespaces/basic/2.0/"
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">
<entry>
<article_title>…</article_title>
<prism:publicationName>…</prism:publicationName>
</entry>
</feed>出典
元システムエンジニア。Web系アプリ開発6年+ソリューション9年、IT実務およそ15年。個人開発者として、政府オープンデータや各府省のAPIを実際に叩いて検証し、「何が取れるか」「実装時にどこで詰まるか」「どう活用するか」を一次検証にもとづいて記録しています。
運営者・検証方針について →