Wikipedia APIを利用して化学したい(1)

Wikipedia Chemical Structure Explorer
http://www.jcheminf.com/content/7/1/10
Wikipediaを利用した構造式検索の論文を読んで、Wikipedia APIに興味がわいたのでその備忘録として。

APIの本体がこちら。
http://en.wikipedia.org/w/api.php

正確にはMediaWiki APIという名前らしい。

日本語版に接続するならここ
http://ja.wikipedia.org/w/api.php

POST, GET両方いけるらしい。とりあえずざっとドキュメントを読んだので、ターゲットを決めて動作確認。
ターゲットは何でも良いんですが、英語版の溶媒カテゴリーがなんとなく有用そう。
http://en.wikipedia.org/wiki/Category:Solvents

上記ページの情報を取得するため、クエリ文字列を入れて動作確認。
http://en.wikipedia.org/w/api.php?action=query&format=json&cmprop=title&cmlimit=500&list=categorymembers&cmtitle=Category:Solvents

簡単な説明
・format=json
→json形式で返してほしい、xmlでも可

・cmprop=title
→タイトルだけでいい、idはいまのところいらない

・cmlimit=200
→初期の表示数10はさすがに少ない。とりあえず200くらいにしておけば問題なし。maxは500。wikipediaさんの気分が変わってmaxが下げられる可能性もあるので500はやめておく。

・list=categorymembers
→カテゴリーメンバーにアクセス

・cmtitle=Category:Solvents
→カテゴリーの指定

結果を見ると”title”にそれぞれのメンバーが入っている。”ns”っていうのが何の略なのかわかりませんが、14がサブカテゴリーを示しているようですね、これは使えそう。

結果を出力するだけのphpコードを試しに実行する。

$requet_url = "http://en.wikipedia.org/w/api.php"; $options = array('http' =-->
	array(
		'method' => 'GET',
	)
);
$data = http_build_query(
	array(
		"action" => "query",
		"format" => "json",
		"cmprop" => "title",
		"cmlimit" => 500,
		"list" => "categorymembers",
		"cmtitle" => "Category:Solvents"
	)
);
$contents = file_get_contents($requet_url . '?' . $data, false, stream_context_create($options));
$category = json_decode($contents,true);
foreach ($category['query']['categorymembers'] as $value) echo $value['title'] ."n";

結果

Solvent
Acetic acid
Acetonitrile
Acidity function
Benzaldehyde
1,2-Butylene carbonate
Cis-2,3-Butylene carbonate
Trans-2,3-Butylene carbonate
Gamma-Butyrolactone
C4mim
Corexit
Deep eutectic solvent
Desolvation
Diluent
Dimethyl sulfoxide
1,3-Dimethyl-2-imidazolidinone
Dispersant
Dispersit
DMPU
Epichlorohydrin
Forestal
Formic acid
Furfural
Hexamethylphosphoramide
Inorganic nonaqueous solvent
List of water-miscible solvents
3-Mercaptopropane-1,2-diol
Methyl isocyanide
N-Methylformamide
Methylsulfonylmethane
1-Nitropropane
2-Nitropropane
Non-methane volatile organic compound
Nujol
Paraldehyde
Partition coefficient
Polyethylene glycol
Protic solvent
Pyrrolidine
Sulfolane
Tetraethylene glycol dimethyl ether
Tetrahydrothiophene
Thiodiglycol
Trapp mixture
Tributyl phosphate
Tricresyl phosphate
Triethyl borate
Triethyl phosphate
Triethylene glycol
Trimethyl borate
Trimethyl phosphate
Category:Alcohol solvents
Category:Amide solvents
Category:Amine solvents
Category:Deuterated solvent
Category:Ester solvents
Category:Ether solvents
Category:Halogenated solvents
Category:Hydrocarbon solvents
Category:Inorganic solvents
Category:Ionic liquids
Category:Ketone solvents
Category:Nitro solvents

“ns”を使ってもう一回階層もぐる。

$requet_url = "http://en.wikipedia.org/w/api.php";
$options = array('http' =>
	array(
		'method' => 'GET',
	)
);

$query = 	array(
		"action" => "query",
		"format" => "json",
		"cmprop" => "title",
		"cmlimit" => 500,
		"list" => "categorymembers",
		"cmtitle" => "Category:Solvents"
);

$data = http_build_query($query);
$contents = file_get_contents($requet_url . '?' . $data, false, stream_context_create($options));
$category = json_decode($contents,true);
foreach ($category['query']['categorymembers'] as $value){
	if($value['ns'] == 14){
		$query['cmtitle'] = $value['title'];
		$data = http_build_query($query);
		$sub_contents = file_get_contents($requet_url . '?' . $data, false, stream_context_create($options));
		$sub_category = json_decode($sub_contents,true);
		foreach ($sub_category['query']['categorymembers'] as $sub_value){
			echo $sub_value['title'] ."n";
		}
	}else{
		echo $value['title'] ."n";
	}
}

さらにサブカテゴリーが出てくる。とりあえずカテゴリーのメンバーを出力してサブカテゴリーの配列を返す関数にしておけば、潜る階層を指定するのも楽そうですね。

function wikipedia_category($arg1){
	$requet_url = "http://en.wikipedia.org/w/api.php";
	$options = array('http' =>
		array(
			'method' => 'GET',
		)
	);

	$query = 	array(
			"action" => "query",
			"format" => "json",
			"cmprop" => "title",
			"cmlimit" => 500,
			"list" => "categorymembers",
			"cmtitle" => $arg1
	);
	$sub_category = array();
	
	$data = http_build_query($query);
	$contents = file_get_contents($requet_url . '?' . $data, false, stream_context_create($options));
	$category = json_decode($contents,true);
	foreach ($category['query']['categorymembers'] as $value){
		if($value['ns'] == 14){
			array_push($sub_category, $value['title']);
		}else{
			echo $value['title'] ."n";
		}
	}
	return $sub_category;
}

これを保存すれば、いろいろなデータベースを利用するときに役に立ちそうです。

  • このエントリーをはてなブックマークに追加
コメントの入力は終了しました。