R语言 从网站的交互式图形中抓取数据

nwwlzxa7  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(125)

也许有人可以帮助从这个图表中获取数据?这可能吗
链接到页面:https://investavimorezultatai.allianz.lt/?tipas=gyvenimo-ciklo-pensiju-fondai
页面只有母语,希望没有问题。

2hh7jdfx

2hh7jdfx1#

您可以通过从页面中抓取数据来将其放入数据框中。这是中等难度的。它需要在页面上找到链接到生成绘图的html的url,然后将此url的内容以纯文本html的形式下载。
在这个html中有一个<script>标签,其中包含一些JavaScript变量。其中一个名为dataProvider,包含作为对象数组的数据序列。您可以使用简单的文本解析将此对象从页面中剪切出来,然后将其传递给jsonlite::fromJSON以将其转换为R dataframe:

library(tidyverse)
library(httr)
library(jsonlite)

dat <- 'https://investavimorezultatai.allianz.lt/graph_pf_new.php?' %>%
  paste0('fdate=2018-12-31&ldate=2023-05-04&code=y3&s=1') %>%
  GET() %>%
  content('text') %>%
  strsplit('dataProvider\": ') %>%
  getElement(1) %>%
  getElement(2) %>%
  strsplit('\n') %>%
  getElement(1) %>%
  getElement(1) %>%
  fromJSON() %>%
  select(date, aValue, bValue) %>%
  pivot_longer(-date, names_to = 'series') %>%
  mutate(date = as.Date(date), value = as.numeric(value))

结果数据如下所示:

head(dat)
#> # A tibble: 6 x 3
#>   date       series value
#>   <date>     <chr>  <dbl>
#> 1 2019-01-02 aValue 100  
#> 2 2019-01-02 bValue 100  
#> 3 2019-01-03 aValue  99.1
#> 4 2019-01-03 bValue 100  
#> 5 2019-01-04 aValue 102. 
#> 6 2019-01-04 bValue 100

然后,这允许您重新创建图,例如使用

ggplot(dat, aes(date, value, color = series)) +
  geom_line(linewidth = 0.3) +
  scale_color_manual(values = c('#023982', '#1ca3d3'),
                     labels = ) +
  scale_y_continuous(NULL, breaks = 8:17 * 10, limits = c(80, 170),
                     expand = c(0, 0)) +
  scale_x_date(NULL, breaks = seq(as.Date('2019-01-01'), 
                                  as.Date('2023-04-01'),
                                  '6 months'),
               minor_breaks = seq(as.Date('2019-01-01'), 
                                  as.Date('2023-04-01'),
                                  '1 months')) +
  theme_classic(base_size = 14) +
  theme(axis.line = element_line(linewidth = 0.3, color = 'gray50'),
        panel.grid.major.x = element_line(),
        panel.grid.minor.x = element_line(),
        panel.grid.major.y = element_line(),
        legend.position = 'none')

相关问题