[C#] Wikipedia の特定のカテゴリーの記事一覧を取得する(声優一覧の取得・名字一覧の取得)
Wikipedia が使用しているシステム MediaWiki の API を使って、特定のカテゴリー(Category:日本の男性声優、Category:日本の女性声優、Category:日本語の姓 など)に属する記事の情報を取得します。
サンプルコード
使う API の使用はこちら。API:Categorymembers - MediaWiki
C# (RestSharp、JSON.NET 使用)で書くとこのような感じです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:日本語の姓 を素材として二次利用しています。