Как получить информацию из категории фильмов в Википедии по API?

Можно ли получить информацию из API Википедии по категориям фильмов? например, у меня есть URL-адрес для поиска аватара, но я не знаю, как искать фильм с аватаром.

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

person limack    schedule 18.01.2016    source источник


Ответы (1)


По "категории фильмов" будет непросто, потому что там много вложенных категорий, но можно использовать и что-то другое - все статьи о кино включают в себя 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)
person Termininja    schedule 19.01.2016