我无法通过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(),但这会导致“无法解析主机”错误。
答案 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上有更全面的示例和小插曲。