【问题标题】:R script to download csv file from a web page where the data link is of data:text/csv用于从数据链接为数据的网页下载 csv 文件的 R 脚本:text/csv
【发布时间】:2020-05-13 16:25:05
【问题描述】:

我正在尝试写一个R脚本,可以从以下网站下载csv文件,”https://www.covidanalytics.io/projections页面底部有一个下载数据的链接,格式为“data:text/ csv ..."。我想知道是否可以有一个 R 脚本来下载 csv 格式的文件。任何帮助将不胜感激。

谢谢 集成电路

【问题讨论】:

  • 哇,这对我来说是新的,令人沮丧。他们在 href 本身中对 data 进行了硬编码。全部 588KB。链接本身似乎是从 Dash 生成的,这意味着 rvest 对我不起作用。但是,如果您有“链接”文本,请删除前导data:text/csv;charset=utf-8,,然后执行read.csv(text = utils::URLdecode(s))(其中s 是“utf-8”之后的内容)。
  • 也许是read.csv(text=URLdecode(sub("data:text/csv;charset=utf-8,", "", s)))。
  • 如何分配 s 变量?
  • 如果您在Github 中使用他们处理过的数据会更容易。该网址太长并且使用了太多参数。
  • @r2evans 我不确定我是否会这样纠正你,但有可能得到s - 请参阅我的答案(s 相当于我的url 变量)。另请参阅我对URLdecode 的讨论

标签: html r export-to-csv


【解决方案1】:

有一些更简单的方法可以获取这些数据,但 可以使用 httr 包进行一些低级工作。

正如@r2evans 所指出的,这是由 Dash 构建的 url 编码的 csv。要获取 url,您需要使用 xhr 请求请求包含 html 页面信息的 json 文件。这需要所有正确的标头以及 POST 请求正文中的 json 请求:

library(httr)

page1 <- GET("https://www.covidanalytics.io/projections")

H <- add_headers( `Host` = "www.covidanalytics.io",
                  `User-Agent` = paste("Mozilla/5.0 (Windows NT 6.1; rv:77.0)", 
                                       "Gecko/20100101 Firefox/77.0"),
                  `Accept` = "application/json",
                  `Accept-Language` = "en-GB,en;q=0.5",
                  `Accept-Encoding` = "gzip, deflate",
                  `Referer` = "https://www.covidanalytics.io/projections",
                  `Content-Type` = "application/json",
                  `X-CSRFToken` = "undefined",
                  `Origin` = "https://www.covidanalytics.io",
                  `Connection` = "keep-alive")

post_data <- paste0('{"output":"page-content.children","outputs":{"id":',
                    '"page-content","property":"children"},"inputs":',
                    '[{"id":"url","property":"pathname","value":',
                    '"/projections"}],"changedPropIds":["url.pathname"]}')

res <- httr::POST("https://www.covidanalytics.io/_dash-update-component", H,
                  body = post_data, encode = "raw")

'res` 现在包含 json 响应,并且我们的 url 编码的 csv 位于其中。我们得到这个解析后的内容并提取包含 url 的字符串:

body <- parsed_content(res)$response$`page-content`$children$props$children[[2]]
div <- body$props$children[[10]]$props$children[[1]]
url <- div$props$children$props$children$props$href

现在我们需要切断data:text/csv;charset=utf-8, 部分并取消转义url 编码。实际上我发现使用嵌套的gsubs 会快得多,因为我的机器在URLdecode 上卡住了:

csv <- strsplit(url, ",")[[1]][2]
df <- read.csv(text = gsub("%0A", "\n", gsub("%20", " ", gsub("%2C", ",", csv))))

您的数据现在位于df。它很大,所以我在这里将它显示为一个小标题:

tidyr::as_tibble(df)
#> # A tibble: 7,106 x 10
#>    Continent Country Province Day   Total.Detected Active Active.Hospital~ Cumulative.Hosp~
#>    <fct>     <fct>   <fct>    <fct> <fct>           <int>            <int>            <int>
#>  1 Africa    Algeria None     2020~ 5651             1531              302              834
#>  2 Africa    Algeria None     2020~ 5742             1514              300              848
#>  3 Africa    Algeria None     2020~ 5831             1497              298              861
#>  4 Africa    Algeria None     2020~ 5917             1477              296              874
#>  5 Africa    Algeria None     2020~ 6000             1457              293              886
#>  6 Africa    Algeria None     2020~ 6079             1435              291              898
#>  7 Africa    Algeria None     2020~ 6156             1411              287              910
#>  8 Africa    Algeria None     2020~ 6230             1387              284              921
#>  9 Africa    Algeria None     2020~ 6300             1361              280              932
#> 10 Africa    Algeria None     2020~ 6368             1335              277              942
#> # ... with 7,096 more rows, and 2 more variables: Total.Detected.Deaths <int>,
#> #   Active.Ventilated <int>

【讨论】:

  • 我怀疑一定有办法,很好。
猜你喜欢
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多