如何通过API获取电影维基百科类别的信息?

时间:2016-01-18 18:17:30

标签: wikipedia wikipedia-api

是否可以通过电影类别从Wikipedia API获取信息?例如,我搜索头像的网址,但我不知道如何搜索头像电影。

https://en.wikipedia.org/w/api.php?&titles=avatar&format=xml&action=query&prop=extracts|categories|categoryinfo|pageterms|pageprops|pageimages&exintro=&explaintext=&cllimit=max&piprop=original

1 个答案:

答案 0 :(得分:2)

“电影类别”并不容易,因为有很多嵌套类别,但你可以使用别的东西 - 所有关于电影的文章都包含在自己Template:Infobox film内,我们可以通过MediaWiki API获取所有这些内容:

https://en.wikipedia.org/w/api.php?format=xml&action=query&list=embeddedin&einamespace=0&eilimit=500&eititle=Template:Infobox_film

然后,您决定如何搜索它们 - 通过正则表达式,Contains()StartsWith()CaseInsensitive或不会,将返回首次找到或所有匹配等...

以下是C#中所有标题以“阿凡达”开头的电影文章的例子:

var articles = GetMovies("Avatar");
...

private static List<string> GetMovies(string word)
{
    var api = "https://en.wikipedia.org/w/api.php?format=xml&action=query&list=embeddedin&" +
        "einamespace=0&eilimit=500&eititle=Template:Infobox film";
    var articles = new List<string>();
    var next = string.Empty;
    while (true)
    {
        using (var response = (HttpWebResponse)WebRequest.Create(api + next).GetResponse())
        {
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                var xElement = XElement.Parse(reader.ReadToEnd());
                articles.AddRange(xElement.Descendants("ei")
                    .Select(x => x.Attribute("title").Value)
                    .Where(x => Regex.IsMatch(x, "^" + word + "\\b")));

                var cont = xElement.Element("continue");
                if (cont == null) break;

                next = "&eicontinue=" + cont.Attribute("eicontinue").Value;
            }
        }
    }

    return articles;
}

这将返回:

Avatar (2009 film)
Avatar (2004 film)
Avatar (1916 film)