На этой странице данные не извлекаются отдельно от API. На самом деле он присутствует на странице html, которую вы скачали, но в теге скрипта в формате JSON и rvest не может его прочитать, потому что данные добавляются в DOM только через Javascript после страница загружается. Чтобы получить данные, вам нужно извлечь и проанализировать JSON:
library(rvest)
library(tibble)
library(jsonlite)
data <- 'https://3g.dxy.cn/newh5/view/pneumonia' %>%
read_html() %>%
html_node('#getAreaStat') %>% # This is the tag containing the JSON
html_text() %>% # Get the javascript from the node
strsplit("(getAreaStat = )|(}catch)") %>% # Carve out the JSON
unlist() %>%
`[`(2) %>% # Unlist and extract the JSON
fromJSON() # Parse the JSON
Теперь data
- это фрейм данных, содержащий всю информацию из JSON. Однако последний столбец data
на самом деле представляет собой список фреймов данных на уровне города. Поскольку все они имеют одинаковые имена столбцов, они могут быть связаны вместе с rbind
. Последний столбец можно затем удалить из data
, поэтому у вас есть фрейм данных с данными на уровне провинции и еще один с данными на уровне города.
city_data <- as_tibble(do.call(rbind, data$cities))
province_data <- as_tibble(data[, -8])
Так что province_data
выглядит примерно так (китайские символы не скопированы, а отображаются в консоли R)
province_data
#> # A tibble: 33 x 7
#> provinceName provinceShortNa~ confirmedCount suspectedCount curedCount deadCount
#> <chr> <chr> <int> <int> <int> <int>
#> 1 ??? ?? 2714 0 52 100
#> 2 ??? ?? 207 0 4 0
#> 3 ??? ?? 173 0 3 0
#> 4 ??? ?? 168 0 0 1
#> 5 ??? ?? 143 0 0 0
#> 6 ??? ?? 132 0 0 0
#> 7 ??? ?? 106 0 0 0
#> 8 ??? ?? 95 0 0 0
#> 9 ??? ?? 91 0 2 1
#> 10 ??? ?? 90 0 0 0
#> # ... with 23 more rows, and 1 more variable: comment <chr>
и city_data выглядит следующим образом (опять же, при правильном отображении cityName в консоли).
#> # A tibble: 329 x 5
#> cityName confirmedCount suspectedCount curedCount deadCount
#> <chr> <int> <int> <int> <int>
#> 1 ?? 1590 0 47 85
#> 2 ?? 213 0 2 4
#> 3 ?? 173 0 0 1
#> 4 ?? 114 0 0 3
#> 5 ?? 91 0 0 0
#> 6 ?? 71 0 1 2
#> 7 ?? 70 0 0 0
#> 8 ?? 70 0 0 0
#> 9 ?? 65 0 0 0
#> 10 ?? 57 0 0 0
#> # ... with 319 more rows