Как получить данные Википедии о Википроектах?

1

Недавно я обнаружил, что в Википедии есть Wikiprojects, которые классифицируются на основе discipline (https://en.wikipedia.org/wiki/Category:WikiProjects_by_discipline). Как показано в ссылке, она имеет 34 дисциплины.

Я хотел бы знать, возможно ли получить все статьи Википедии, связанные с каждой из этих wikipedia disciplines.

Например, рассмотрим WikiProject Computer science‎. Можно ли получить все компьютерные науки, связанные с использованием Википедии статьи WikiProject Computer science‎ категории? Если так, есть ли какие-либо дампы данных, связанные с этим, или есть какой-либо другой способ получить эти данные?

В настоящее время я использую python (то есть pywikibot и pymediawiki). Однако я рад получить ответы и на других языках.

Я рад предоставить более подробную информацию, если это необходимо.

  • 0
    Может быть, вы можете использовать API Википедии, чтобы получить ресурсы, которые вы хотите из Википедии, перейдите по этой ссылке
  • 0
    @AliCSE Спасибо за комментарий. Я не мог понять, как API MediaWiki можно использовать для выполнения этой задачи. У Вас есть какие-то предложения? :)
Показать ещё 3 комментария
Теги:
wikipedia
wikipedia-api
mediawiki
mediawiki-api

2 ответа

2
Лучший ответ

Как я предложил и добавил к ответу @arash, вы можете использовать API Википедии для получения данных Википедии. Вот ссылка с описанием того, как это сделать, API: Categorymembers # GET_request

Как вы отметили, что вам нужно получить данные с помощью программы, ниже приведен пример кода на JavaScript. Он извлечет первые 500 имен из Category:WikiProject_Computer_science_articles и отобразит их в виде выходных данных. Вы можете преобразовать язык по вашему выбору на основе этого примера:

// Importing the module
const fetch = require('node-fetch');

// URL with resources to fetch
const url = "https://en.wikipedia.org/w/api.php?action=query&format=json&list=categorymembers&cmtitle=Category%3AWikiProject_Computer_science_articles&cmprop.ids=1&cmlimit=500";

// Fetching using 'node-fetch'
fetch(url).then(res => res.json()).then(t => {
    // Getting the length of the returned array
    let len = t.query.categorymembers.length;
    // Iterating over all the response data
    for(let i=0;i<len;i++) {
        // Printing the names
        console.log(t.query.categorymembers[i].title);
    }
});

Чтобы записать данные в файл, вы можете сделать, как показано ниже:

//Importing the modules
const fetch = require('node-fetch');
const fs = require('fs');

//URL with resources to fetch
const url = "https://en.wikipedia.org/w/api.php?action=query&format=json&list=categorymembers&cmtitle=Category%3AWikiProject_Computer_science_articles&cmprop.ids=1&cmlimit=500";

//Fetching using 'node-fetch'
fetch(url).then(res => res.json()).then(t => {
    // Getting the length of the returned array
    let len = t.query.categorymembers.length;
    // Initializing an empty array
    let titles = [];
    // Iterating over all the response data
    for(let i=0;i<len;i++) {
        // Printing the names
        let title = t.query.categorymembers[i].title;
        console.log(title);
        titles[i] = title;
    }
    fs.writeFileSync('pathtotitles\\titles.txt', titles);
});

Выше один будет хранить данные в файл с , отделенным, потому что мы с помощью массива JavaScript там. Если вы хотите хранить в каждой строке без запятых, то вам нужно сделать так:

//Importing the modules
const fetch = require('node-fetch');
const fs = require('fs');

//URL with resources to fetch
const url = "https://en.wikipedia.org/w/api.php?action=query&format=json&list=categorymembers&cmtitle=Category%3AWikiProject_Computer_science_articles&cmprop.ids=1&cmlimit=500";

//Fetching using 'node-fetch'
fetch(url).then(res => res.json()).then(t => {
    // Getting the length of the returned array
    let len = t.query.categorymembers.length;
    // Initializing an empty array
    let titles = '';
    // Iterating over all the response data
    for(let i=0;i<len;i++) {
        // Printing the names
        let title = t.query.categorymembers[i].title;
        console.log(title);
        titles += title + "\n";
    }
    fs.writeFileSync('pathtotitles\\titles.txt', titles);
});

Используя cmlimit, мы не можем получить более 500 заголовков, поэтому нам нужно использовать cmcontinue для проверки и получения следующих страниц...

Попробуйте приведенный ниже код, который выбирает все заголовки определенной категории и печатает, добавляет данные в файл:

//Importing the modules
const fetch = require('node-fetch');
const fs = require('fs');
//URL with resources to fetch
var url = "https://en.wikipedia.org/w/api.php?action=query&format=json&list=categorymembers&cmtitle=Category%3AWikiProject_Computer_science_articles&cmlimit=500";

// Method to fetch and append the data to a file 
var fetchTheData = async (url, index) => {
    return await fetch(url).then(res => res.json()).then(data => {
        // Getting the length of the returned array
        let len = data.query.categorymembers.length;
        // Initializing an empty string
        let titles = '';
        // Iterating over all the response data
        for(let i=0;i<len;i++) {
            // Printing the names
            let title = data.query.categorymembers[i].title;
            console.log(title);
            titles += title + "\n";
        }
        // Appending to the file
        fs.appendFileSync('pathtotitles\\titles.txt', titles);
        // Handling an end of error fetching titles exception
        try {
            return data.continue.cmcontinue;
        } catch(err) {
            return "===>>> Finished Fetching...";
        }
    });
}

// Method which will construct the next URL with next page to fetch the data
var constructNextPageURL = async (url) => {
    // Getting the next page token
    let nextPage = await fetchTheData(url);
    for(let i=1;i<=14;i++) {
        await console.log("=> The next page URL is : "+(url + '&cmcontinue=' + nextPage));
        // Constructing the next page URL with next page token and sending the fetch request
        nextPage = await fetchTheData(url + '&cmcontinue=' + nextPage);
    }
}

// Calling to begin extraction
constructNextPageURL(url);

Я надеюсь, что это помогает...

  • 0
    Большое спасибо. Я запусту этот код и сообщу, как он работает :)
  • 1
    Пожалуйста, дайте мне знать. Если вышеприведенное не сработает, я постараюсь реализовать решение на вашем языке python ...
Показать ещё 11 комментариев
2

Вы можете использовать API: Categorymembers для получения списка подкатегорий и страниц. установите параметр "cmtype" в "subcat", чтобы получить подкатегории, и "cmnamespace" в "0", чтобы получить статьи.

Также вы можете получить список из базы данных (информация об иерархии категорий в таблице ссылок и информация о статьях в таблице страниц).

  • 0
    Большое спасибо за ответ. Было бы здорово, если бы вы могли показать мне, как я могу это сделать с помощью кода (поскольку я все еще пытаюсь понять, как использовать API и базу данных). С нетерпением жду Вашего ответа. Спасибо еще раз :)
  • 0
    Если cmtitle быть WikiProject Computer science‎ ? :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню