我编写的代码可以从网址下载和读取多个网络文件,但只有在我首先手动点击并打开每个文件时才能生效。我认为这是因为网站被锁定,当我手动点击相关网页时,代码就能够在不被锁定的情况下读取文件。
我的代码是:
VAR=c('tas', 'tasmin', 'tasmax', 'pr')
RCP=c('rcp26', 'rcp45', 'rcp60', 'rcp85')
SEQ=sprintf('%0.3d', 0:20)
for(i in VAR){
for(j in RCP){
for(k in SEQ){
FILES=read.table(paste0("https://climexp.knmi.nl/data/icmip5_",
i, "_Amon_mod_", j, "_5-7.5E_50-52.5N_n_su_", k, ".dat"))
colnames(FILES)=c("YEAR", "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
"JUL", "AUG", "SEP", "OCT", "NOV", "DEC")
write.table(FILES, file=paste0("C:/.../", i, "-", j, "-", k, ".txt"), sep="\t")
}
}
}
以下是此导入的众多文件之一的链接:
https://climexp.knmi.nl/data/icmip5_tasmin_Amon_mod_rcp45_5-7.5E_50-52.5N_n_su_000.dat
这对我开放,因为我在网站上手动操作,但如果你们中的一个点击它可能无法正确打开。这就是问题。我需要修改我的代码以识别这些网站被锁定/密码保护,我需要以某种方式编写一些代码来首先解锁网站,然后像我上面那样下载它。
有什么想法吗?
答案 0 :(得分:0)
没有(因为没有更好的术语)"点击路径"你花了最多的时间来获取数据是为了向你展示如何找出你需要进一步探索的地方。
使用"开发人员工具"在Chrome中打开,我转到https://climexp.knmi.nl/,将我重定向到https://climexp.knmi.nl/selectfield_cmip5.cgi?id=someone@somewhere并选择"每月CMIP5场景运行"。在那里,我选择" 1"在" tas"在" CMIP5意味着"然后单击"选择字段"。这带来了另一页,我输入你的纬度/经度进入"获取网格点,平均面积或生成子集"表格框并单击"制作时间序列"。这带来了一个结果页面的图表和下载数据的链接。
我有"开发者工具"因为我正在检查传递到每个后续URL的内容,因为浏览器位置栏上没有放置任何参数(即他们不是GET
个请求)。值得庆幸的是,没有"会话"或与这些请求相关的cookie,这个过程似乎是可重复的(我尝试了#34;技巧"以下#34; tasmin"以及" tasmax"以及他们都工作了)。
我用"复制为curl" in"开发人员工具"在" .cgi"链接并使用curlconverter
包将其转换为httr
动词调用:
library(httr)
library(rvest)
res <- POST(url = "https://climexp.knmi.nl/get_index.cgi",
body = list(email = "someone@somewhere",
field = "cmip5_tas_Amon_modmean_rcp26",
maskmetadata = "",
lat1 = "50",
lat2 = "52.5",
lon1 = "5",
lon2 = "7.5",
intertype = "nearest",
gridpoints = "false",
masktype = "all",
standardunits = ""),
encode = "form")
检索整个页面(带有图表和数据链接的页面)。我们可以阅读该页面:
pg <- content(res)
然后找到所有数据链接:
html_nodes(pg, "a") %>%
html_attr("href") %>%
grep("^data", ., value=TRUE)
## [1] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++.eps.gz"
## [2] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++__yr.eps.gz"
## [3] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++__yr.txt"
## [4] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++_a.eps.gz"
## [5] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++_a.txt"
现在,这些都不是.dat
个文件,但由于我没有选择与您相同的选项,因为这些文件很糟糕。
但这应该可以帮助你。