Проблема с webscraping селектором гаджета и rvest - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь очистить данные из https://3g.dxy.cn/newh5/view/pneumonia, используя SelectorGadget и rvest

Я успешно очищаю некоторый текст на странице с помощью следующего кода.

library(rvest)
url        <- 'https://3g.dxy.cn/newh5/view/pneumonia'
webpage    <- read_html(url)

TEXT_html <- html_nodes(webpage,'.descText___Ui3tV')
TEXT      <- html_text(TEXT_html)

Но когда я пытаюсь выбрать таблицу, в которой наиболее важные данные (количество людей, инфицированных в таблице) см. Выбор , используя следующий код

TABLE_html <- html_nodes(webpage,'.areaBlock1___3V3UU p')
TABLE      <- html_text(TABLE_html)

, вывод "character 0"

Я думаю, это потому, что данные в таблице нельзя увидеть, потому что они обновляются через API, но я не знаю, как решить эту проблему

У кого-нибудь есть идея? большое спасибо

1 Ответ

3 голосов
/ 28 января 2020

На этой странице данные не извлекаются отдельно от 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
...