无法在R中访问EIA API

时间:2019-07-02 08:39:21

标签: r xml http

我无法通过R(https://www.eia.gov/opendata/)访问能源信息管理局的API。

在我的办公室计算机上,如果我在浏览器中尝试该链接,该链接将起作用,并且显示数据(完整的URL:https://api.eia.gov/series/?series_id=PET.MCREXUS1.M&api_key=e122a1411ca0ac941eb192ede51feebe&out=json)。

我还通过R成功连接到Bloomberg的API,因此R能够访问网络。

由于API可以正常工作并且不受我公司的防火墙的阻止,并且R实际上可以连接到Internet,所以我不知道出了什么问题。

该脚本可以在我的家用计算机上正常运行,但是在我的办公室计算机上却无法成功。因此,我认为这是一个网络问题,但是如果有人可以针对任何问题向我指出任何方向,我将不胜感激(我的IT部门无能为力)。

library(XML)

api.key = "e122a1411ca0ac941eb192ede51feebe"
series.id = "PET.MCREXUS1.M"

my.url = paste("http://api.eia.gov/series?series_id=", series.id,"&api_key=", api.key, "&out=xml", sep="")

doc = xmlParse(file=my.url, isURL=TRUE) # yields error

错误消息:

No such file or directoryfailed to load external entity "http://api.eia.gov/series?series_id=PET.MCREXUS1.M&api_key=e122a1411ca0ac941eb192ede51feebe&out=json"
Error: 1: No such file or directory2: failed to load external entity "http://api.eia.gov/series?series_id=PET.MCREXUS1.M&api_key=e122a1411ca0ac941eb192ede51feebe&out=json"

我尝试了其他一些方法,例如xml2包中的read_xml(),但这会导致“无法解析主机”错误。

2 个答案:

答案 0 :(得分:0)

要获取XML,您需要将URL更改为XML:

my.url = paste("http://api.eia.gov/series?series_id=", series.id,"&api_key=", 
               api.key, "&out=xml", sep="")

res <- httr::GET(my.url)
xml2::read_xml(res)

或:

res <- httr::GET(my.url)
XML::xmlParse(res)

否则,帖子原样(即&out=json):

    res <- httr::GET(my.url)
   jsonlite::fromJSON(httr::content(res,"text")) 

或者这个:

xml2::read_xml(httr::content(res,"text"))

请注意,此答案只是提供了一种获取数据的方式,无论其是否以所需的形式基于意见,并且取决于处理数据的人。

答案 1 :(得分:0)

如果不一定要输出XML,则还可以使用新的eia包。 (免责声明:我是作者。)

使用您的示例:

remotes::install_github("leonawicz/eia")
library(eia)
x <- eia_series("PET.MCREXUS1.M")

这假定您的密钥是全局设置的(例如,在.Renviron中或之前在您的eia_set_key的R会话中)。但是您也可以通过添加key = "yourkeyhere"将其直接传递给上面的函数调用。

返回的结果是一个tidyverse样式的数据帧,每个序列ID一行,并包含一个data列表列,其中包含每个时间序列的数据帧(如果需要,可以与tidyr::unnest嵌套) )。

或者,如果您设置参数tidy = FALSE,它将返回jsonlite::fromJSON的列表结果,而无需进行“整洁”处理。

最后,如果您设置tidy = NA,则根本不进行任何处理,并且对于打算将原始输出传递给其他固定代码或软件的用户,您将获得原始JSON字符串输出。该软件包不提供XML输出。

在我创建的eia package website上有更全面的示例和小插曲。