Недавно я обнаружил, что в Википедии есть Wikiprojects
, которые классифицируются на основе discipline
(https://en.wikipedia.org/wiki/Category:WikiProjects_by_discipline). Как показано в ссылке, она имеет 34 дисциплины.
Я хотел бы знать, возможно ли получить все статьи Википедии, связанные с каждой из этих wikipedia disciplines
.
Например, рассмотрим WikiProject Computer science
. Можно ли получить все компьютерные науки, связанные с использованием Википедии статьи WikiProject Computer science
категории? Если так, есть ли какие-либо дампы данных, связанные с этим, или есть какой-либо другой способ получить эти данные?
В настоящее время я использую python (то есть pywikibot
и pymediawiki
). Однако я рад получить ответы и на других языках.
Я рад предоставить более подробную информацию, если это необходимо.
Как я предложил и добавил к ответу @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);
Я надеюсь, что это помогает...
python
...
Вы можете использовать API: Categorymembers для получения списка подкатегорий и страниц. установите параметр "cmtype" в "subcat", чтобы получить подкатегории, и "cmnamespace" в "0", чтобы получить статьи.
Также вы можете получить список из базы данных (информация об иерархии категорий в таблице ссылок и информация о статьях в таблице страниц).
cmtitle
быть WikiProject Computer science
? :)