Как получить данные Википедии о Википроектах? - PullRequest
0 голосов
/ 17 февраля 2019

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Как я предложил и добавил к ответу @ arash, вы можете использовать API Wikipedia для получения данных Wikipedia.Вот ссылка с описанием того, как это сделать, 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 голосов
/ 17 февраля 2019

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

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

...