[C#] Wikipedia の特定のカテゴリーの記事一覧を取得する(声優一覧の取得・名字一覧の取得)
Wikipedia が使用しているシステム MediaWiki の API を使って、特定のカテゴリー(Category:日本の男性声優、Category:日本の女性声優、Category:日本語の姓 など)に属する記事の情報を取得します。
サンプルコード
使う API の使用はこちら。API:Categorymembers - MediaWiki
C# (RestSharp、JSON.NET 使用)で書くとこのような感じです。
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var titles = GetTitles("Category:日本語の姓"); | |
File.WriteAllText("日本語の姓.txt", string.Join("\r\n", titles), Encoding.UTF8); | |
} | |
private static List<string> GetTitles(string cmtitle) | |
{ | |
var titles = new List<string>(); | |
var client = new RestClient("https://ja.wikipedia.org/w/") {ThrowOnAnyError = true}; | |
string cmcontinue = null; | |
do | |
{ | |
var request = new RestRequest("api.php", DataFormat.Json) | |
.AddParameter("action", "query") | |
.AddParameter("list", "categorymembers") | |
.AddParameter("cmprop", "title") // タイトルのみ取得 | |
.AddParameter("format", "json") | |
.AddParameter("cmlimit", "500") | |
.AddParameter("cmtitle", cmtitle); | |
if (cmcontinue != null) | |
request.AddParameter("cmcontinue", cmcontinue); | |
var response = client.Get(request); | |
var o = JObject.Parse(response.Content); | |
titles.AddRange(o["query"]?["categorymembers"].Select(x => x["title"].ToString())); | |
cmcontinue = o["continue"]?["cmcontinue"]?.ToString(); | |
} while (cmcontinue != null); | |
return titles; | |
} | |
} |
ポイントは、Wikipedia にページ送りがあるように、一覧をまとめて取得できず、すべてを取得するには、頭から順に取得していく必要があります。レスポンスにある cmcontinue パラメーターの値を使うことで、続きの情報を順番に取得できます。
結果
Category:日本の女性声優 では、2020/4/12 現在、「このカテゴリには 4,873 ページが含まれており」とありますが、取得した結果、4,870件でした。Wikipedia のページ上で200ページずつ進めて取得したデータと比較しましたがずれは無かったので、ページ総数はキャッシュ等でずれが生じるときがあるのかも?
試しに取得したデータです。
※ Creative Commons — 表示 - 継承 3.0 非移植 — CC BY-SA 3.0 のもとで公表されたウィキペディアの項目Category:日本の女性声優、Category:日本の男性声優、Category:日本語の姓 を素材として二次利用しています。