Как извлечь данные из категории Digida: различия между версиями
Материал из Поле цифровой дидактики
Patarakin (обсуждение | вклад) Нет описания правки |
Patarakin (обсуждение | вклад) Нет описания правки |
||
| Строка 24: | Строка 24: | ||
ua <- "digida-research-bot/0.1 (contact: patarakined@mgpu.ru)" ## Agent | ua <- "digida-research-bot/0.1 (contact: patarakined@mgpu.ru)" ## Agent | ||
############# | ############# Перечень статей в категории | ||
get_category_pages <- function(category_name, limit = 500) { | get_category_pages <- function(category_name, limit = 500) { | ||
params <- list( | params <- list( | ||
| Строка 46: | Строка 47: | ||
return(data$query$categorymembers) # оставить | return(data$query$categorymembers) # оставить | ||
} | } | ||
################# | ################# | ||
get_page_content <- function(page_title) { | get_page_content <- function(page_title) { | ||
params <- list( | params <- list( | ||
| Строка 81: | Строка 81: | ||
content = page_text | content = page_text | ||
) | ) | ||
return(result) # | return(result) | ||
} | |||
################ Все тексты категории | |||
get_all_category_content <- function(category_name, limit = 500, sleep_sec = 0.5) { | |||
pages_df <- get_category_pages(category_name, limit = limit) | |||
all_content <- vector("list", nrow(pages_df)) | |||
for (i in seq_len(nrow(pages_df))) { | |||
page_title <- pages_df$title[i] | |||
cat("Working with page", i, "from", nrow(pages_df), ":", page_title, "\n") | |||
tryCatch({ | |||
content <- get_page_content(page_title) | |||
all_content[[i]] <- content | |||
}, error = function(e) { | |||
cat("Mistake in", page_title, ":", e$message, "\n") | |||
}) | |||
Sys.sleep(sleep_sec) | |||
} | |||
return(all_content) # | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Версия от 19:14, 8 декабря 2025
| Описание | Мы хотим проанализировать тексты, которые хранятся в статья определенной категории поля цифровой дидактики. Есть 2 способа - экспорт статей и использование MediaWiki API |
|---|---|
| Область знаний | Лингвистика, Статистика |
| Область использования (ISTE) | |
| Возрастная категория | 16
|
| Поясняющее видео | |
| Близкие рецепту понятия | |
| Среды и средства для приготовления рецепта: | R, Semantic MediaWiki, MediaWiki API |
Использовать Экспорт статей
Воспользоваться Служебная:Экспорт и скачать все статьи из категории
Использовать R
library(httr2)
library(jsonlite)
library(tidyverse)
library(ggplot2)
library(quanteda)
library(stopwords)
getwd()
base_url <- "http://digida.mgpu.ru/api.php"
ua <- "digida-research-bot/0.1 (contact: patarakined@mgpu.ru)" ## Agent
############# Перечень статей в категории
get_category_pages <- function(category_name, limit = 500) {
params <- list(
action = "query",
list = "categorymembers",
cmtitle = paste0("Category:", category_name),
cmlimit = limit,
cmtype = "page",
format = "json"
)
response <- request(base_url) %>%
req_headers(
`User-Agent` = ua,
`Api-User-Agent` = ua
) %>%
req_url_query(!!!params) %>%
req_perform()
data <- resp_body_string(response) %>% fromJSON()
return(data$query$categorymembers) # оставить
}
#################
get_page_content <- function(page_title) {
params <- list(
action = "query",
titles = page_title,
prop = "revisions",
rvprop = "content",
format = "json"
)
response <- request(base_url) %>%
req_headers(
`User-Agent` = ua,
`Api-User-Agent` = ua
) %>%
req_url_query(!!!params) %>%
req_perform()
data <- resp_body_string(response) %>% fromJSON()
pages_data <- data$query$pages
page_info <- pages_data[[1]]
if (!is.null(page_info$revisions) && nrow(page_info$revisions) > 0) {
page_text <- page_info$revisions$`*`[1]
} else {
page_text <- NA
}
result <- list(
pageid = page_info$pageid,
title = page_info$title,
content = page_text
)
return(result)
}
################ Все тексты категории
get_all_category_content <- function(category_name, limit = 500, sleep_sec = 0.5) {
pages_df <- get_category_pages(category_name, limit = limit)
all_content <- vector("list", nrow(pages_df))
for (i in seq_len(nrow(pages_df))) {
page_title <- pages_df$title[i]
cat("Working with page", i, "from", nrow(pages_df), ":", page_title, "\n")
tryCatch({
content <- get_page_content(page_title)
all_content[[i]] <- content
}, error = function(e) {
cat("Mistake in", page_title, ":", e$message, "\n")
})
Sys.sleep(sleep_sec)
}
return(all_content) #
}
