[C#] Wikipedia の特定のカテゴリーの記事一覧を取得する(声優一覧の取得・名字一覧の取得)

Web ServiceMediaWiki, 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;
}
}

view raw
Program.cs
hosted with ❤ by GitHub

ポイントは、Wikipedia にページ送りがあるように、一覧をまとめて取得できず、すべてを取得するには、頭から順に取得していく必要があります。レスポンスにある cmcontinue パラメーターの値を使うことで、続きの情報を順番に取得できます。

結果

Category:日本の女性声優 では、2020/4/12 現在、「このカテゴリには 4,873 ページが含まれており」とありますが、取得した結果、4,870件でした。Wikipedia のページ上で200ページずつ進めて取得したデータと比較しましたがずれは無かったので、ページ総数はキャッシュ等でずれが生じるときがあるのかも?

試しに取得したデータです。

Creative Commons — 表示 - 継承 3.0 非移植 — CC BY-SA 3.0 のもとで公表されたウィキペディアの項目Category:日本の女性声優Category:日本の男性声優Category:日本語の姓 を素材として二次利用しています。