Как собрать данные Scratch Wiki при помощи MediaWiki API

Материал из Поле цифровой дидактики
Версия от 08:54, 6 марта 2026; Patarakin (обсуждение | вклад) (Новая страница: «{{Scripting Tutorials |Description=Знания сообщества Scratch хранятся в нескольких вики на разных языках. Мы хотим собрать и сравнить данные о поведении участников |Field_of_knowledge=Информатика, Робототехника, Моделирование |Возрастная категория=14 |Environment=MediaWiki API, Scratch, R }} MediaWiki A...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Описание Знания сообщества 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))
}