科研費データベース(KAKEN)の情報をプログラムから取得する方法を解説します。
1. はじめに
KAKENは、国立情報学研究所(NII)が提供する科学研究費助成事業データベースです。OpenSearch APIを利用することで、研究課題の情報をプログラムから取得できます。
2. 事前準備:アプリケーションIDの取得
KAKEN APIを利用するには、CiNiiでアプリケーションIDを取得する必要があります。
- CiNii API利用登録にアクセス
- 必要事項を入力して登録申請
- 承認後、メールでApplication ID(appid)が届く
注意 : 登録から承認まで時間がかかる場合があります。
3. APIエンドポイント
研究課題をさがす
https://kaken.nii.ac.jp/opensearch/
研究者をさがす
https://nrid.nii.ac.jp/opensearch/
4. 主要パラメータ(研究課題をさがす)
| パラメータ | 説明 | 必須 | 例 |
|---|---|---|---|
appid | アプリケーションID | ○ | 82RKpPlZiIjbqKwFDO3D |
qb | 研究課題番号で検索 | △ | 19K20626 |
kw | フリーワード検索 | △ | IIIF |
qa | 研究課題名で検索 | △ | デジタルアーカイブ |
qg | 研究者の姓名で検索 | △ | 中村覚 |
qm | 研究者番号で検索 | △ | 80802743 |
format | レスポンス形式 | - | xml(デフォルト: html5) |
rw | 1ページの件数 | - | 20, 50, 100, 200, 500 |
lang | 言語 | - | ja, en |
△: いずれか1つ以上が必要
その他の検索パラメータ
| パラメータ | 説明 |
|---|---|
qc | 研究種目で検索 |
qd | 審査区分/研究分野で検索 |
qe | 研究機関で検索 |
s1, s2 | 助成期間(From/To)で検索 |
qf | キーワードで検索 |
詳細は公式ドキュメントを参照してください。
5. 使用例
例1: 課題番号で検索
curl "https://kaken.nii.ac.jp/opensearch/?appid=YOUR_APPID&qb=19K20626&format=xml"
例2: キーワードで検索
curl "https://kaken.nii.ac.jp/opensearch/?appid=YOUR_APPID&kw=IIIF&format=xml&rw=50"
例3: 研究者番号で検索
curl "https://kaken.nii.ac.jp/opensearch/?appid=YOUR_APPID&qm=80802743&format=xml"
6. レスポンス形式
format=xmlを指定した場合、以下のようなXMLが返されます。
レスポンス例(19K20626)
<?xml version="1.0" encoding="UTF-8"?>
<grantAwards>
<totalResults>1</totalResults>
<startIndex>1</startIndex>
<itemsPerPage>20</itemsPerPage>
<grantAward id="KAKENHI-PROJECT-19K20626"
recordSet="kakenhi"
projectType="project"
awardNumber="19K20626">
<urlList>
<url>https://kaken.nii.ac.jp/grant/KAKENHI-PROJECT-19K20626/</url>
</urlList>
<summary xml:lang="ja">
<title>IIIFとTEIを用いたオンライン翻刻支援システムの開発</title>
<awardNumber awardNumber="19K20626" sequence="1"/>
<category niiCode="252">若手研究</category>
<member sequence="1" eradCode="80802743" role="principal_investigator">
<institution>東京大学</institution>
<department>史料編纂所</department>
<jobTitle>助教</jobTitle>
<personalName sequence="1">
<fullName>中村 覚</fullName>
<familyName yomi="ナカムラ">中村</familyName>
<givenName yomi="サトル">覚</givenName>
</personalName>
<enriched>
<researcherNumber type="erad">80802743</researcherNumber>
</enriched>
</member>
<projectStatus fiscalYear="2022" statusCode="project_closed"/>
<keywordList>
<keyword sequence="1">IIIF</keyword>
<keyword sequence="2">TEI</keyword>
<keyword sequence="3">RDF</keyword>
<keyword sequence="4">OCR</keyword>
<keyword sequence="5">Omeka</keyword>
<keyword sequence="6">人文情報学</keyword>
<keyword sequence="7">デジタルアーカイブ</keyword>
<keyword sequence="8">翻刻</keyword>
</keywordList>
<periodOfAward>
<startDate>2019-04-01</startDate>
<endDate>2023-03-31</endDate>
</periodOfAward>
<overallAwardAmount>
<directCost>3500000</directCost>
<indirectCost>1050000</indirectCost>
<totalCost>4550000</totalCost>
</overallAwardAmount>
</summary>
</grantAward>
</grantAwards>
7. 取得できる主な情報
| 要素 | 説明 |
|---|---|
awardNumber | 課題番号 |
title | 研究課題名 |
category | 研究種目(若手研究、基盤研究など) |
member | 研究者情報(氏名、所属、研究者番号、役割) |
projectStatus | 研究状態(granted: 実施中、project_closed: 完了) |
keywordList | キーワード |
periodOfAward | 研究期間 |
overallAwardAmount | 配分額(直接経費、間接経費、合計) |
paragraphList | 研究概要 |
研究者の役割(role属性)
| 値 | 説明 |
|---|---|
principal_investigator | 研究代表者 |
co_investigator_buntan | 研究分担者 |
co_investigator_renkei | 連携研究者 |
8. プログラムからの利用例
JavaScript/TypeScript(Next.js)
type KakenMember = {
name: string;
researcherId: string;
role: 'pi' | 'coi';
institution: string;
department: string;
jobTitle?: string;
};
type KakenProject = {
grantId: string;
title: string;
category?: string;
period?: { start?: string; end?: string };
members: KakenMember[];
keywords?: string[];
};
async function fetchKakenProject(
grantId: string,
appId: string
): Promise<KakenProject | null> {
const url = new URL('https://kaken.nii.ac.jp/opensearch/');
url.searchParams.set('appid', appId);
url.searchParams.set('qb', grantId);
url.searchParams.set('format', 'xml');
const response = await fetch(url.toString());
if (!response.ok) return null;
const xml = await response.text();
return parseKakenXml(xml, grantId);
}
function parseKakenXml(xml: string, grantId: string): KakenProject | null {
// XMLパース処理
// ...
}
Python
import requests
import xml.etree.ElementTree as ET
def fetch_kaken_project(grant_id: str, app_id: str) -> dict | None:
url = "https://kaken.nii.ac.jp/opensearch/"
params = {
"appid": app_id,
"qb": grant_id,
"format": "xml"
}
response = requests.get(url, params=params)
if response.status_code != 200:
return None
root = ET.fromstring(response.content)
# XMLパース処理
# ...
# 使用例
project = fetch_kaken_project("19K20626", "YOUR_APPID")
9. 注意事項
- 利用規約の遵守 : 短時間に大量のアクセスは避けてください
- キャッシュの活用 : 同じデータを繰り返し取得する場合はキャッシュを利用しましょう
- 所属情報について : APIで取得できる所属は「採択時点」のものです。現在の所属とは異なる場合があります
- エラーハンドリング : APIが利用できない場合のフォールバック処理を実装しましょう