Как собрать данные Scratch Wiki при помощи MediaWiki API
Материал из Поле цифровой дидактики
| Описание | Знания сообщества Scratch хранятся в нескольких вики на разных языках. Мы хотим собрать и сравнить данные о поведении участников |
|---|---|
| Область знаний | Информатика, Робототехника, Моделирование |
| Область использования (ISTE) | |
| Возрастная категория | 14
|
| Поясняющее видео | |
| Близкие рецепту понятия | |
| Среды и средства для приготовления рецепта: | MediaWiki API, Scratch, R |
MediaWiki API — это интерфейс для программного доступа к вики-сайтам, таким как Wikipedia или локальные MediaWiki. Он позволяет запрашивать списки страниц, их содержимое, историю правок и метаданные через HTTP-запросы
Для работы с API в R используйте пакеты httr (или httr2) для HTTP-запросов, jsonlite для парсинга JSON-ответов и tidyverse для обработки данных.
Функции
Функция Safe-get
Функция safe_get — это обёртка над GET из httr с обработкой ошибок (например, retry при таймауте), часто реализуемая через purrr::safely.
safe_get <- function(base_url, params) {
library(httr)
library(jsonlite)
resp <- GET(base_url, query = params)
if (http_type(resp) != "application/json") {
warning("API не вернул JSON")
return(NULL)
}
fromJSON(content(resp, "text"))
}
get-all-pages
get_all_pages <- function(base_url, max_pages = 1600, verbose = TRUE) {
all_pages <- list()
apcontinue <- NULL
pages_count <- 0
repeat {
params <- list(
action = "query",
list = "allpages",
apnamespace = "0",
aplimit = 500, # максимум за раз
apdir = "ascending",
format = "json"
)
if (!is.null(apcontinue)) params$apcontinue <- apcontinue
resp <- safe_get(base_url, params)
if (is.null(resp$query$allpages)) break
all_pages <- c(all_pages, resp$query$allpages)
pages_count <- pages_count + length(resp$query$allpages)
if (verbose) cat("Получено страниц:", pages_count, "\n")
# Проверяем условие остановки
if (pages_count >= max_pages || is.null(resp$continue)) break
apcontinue <- resp$continue$apcontinue
}
as_tibble(do.call(rbind, all_pages)) %>%
select(pageid, title) %>%
rename(page_title = title) %>%
mutate(pageid = as.numeric(pageid))
}
