无法使用 R(RCurl 包)访问 HTML 站点的目录
Unable to access directory of HTML site using R (RCurl package)
我正在尝试使用 R 中的 RCurl 包访问以下天气数据的 http 目录:
http://ncei.noaa.gov/data/global-summary-of-the-day/access/
每年的每个目录中都有一个唯一的气象站列表。
我可以像这样访问任何特定的数据集
url = 'http://ncei.noaa.gov/data/global-summary-of-the-day/access/1932/03005099999.csv'
data = read.csv(url)
但是,我无法在不知道每个目录中有哪些文件的情况下自动执行此过程。我试过使用 RCurl 包来获取其中所有文件的列表,但总是出现错误:
url = 'http://ncei.noaa.gov/data/global-summary-of-the-day/access/'
getURL(url)
这给了我以下输出,说明地址已更改(到 https 地址)
[1] "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>301 Moved Permanently</title>\n</head><body>\n<h1>Moved Permanently</h1>\n<p>The document has moved <a href=\"https://ncei.noaa.gov/data/global-summary-of-the-day/access/\">here</a>.</p>\n</body></html>\n"
将地址更改为 https url 指示会出现此错误
url = 'https://ncei.noaa.gov/data/global-summary-of-the-day/access/'
getURL(url)
Error in function (type, msg, asError = TRUE) : error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
我尝试将 https: 替换为 ftps: 和 ftp: 这样做会出现超时错误。
对打印目录有什么想法吗?
我认为这里的问题是服务器仅支持使用 TLS 1.2 版和您的 RCurl does not support it.
的请求
您可以使用 httr
和 rvest
实现您想要的效果。例如,要获取列出 1929 目录中文件的小标题:
library(httr)
library(rvest)
url1 <- "https://www.ncei.noaa.gov/data/global-summary-of-the-day/access/1929"
page_data <- GET(url1)
files <- content(page_data, as = "parsed") %>%
html_table() %>%
.[[1]]
files
# A tibble: 24 x 4
Name `Last modified` Size Description
<chr> <chr> <chr> <lgl>
1 "" "" "" NA
2 "Parent Directory" "" "-" NA
3 "03005099999.csv" "2019-01-19 12:37" "20K" NA
4 "03075099999.csv" "2019-01-19 12:37" "20K" NA
5 "03091099999.csv" "2019-01-19 12:37" "17K" NA
6 "03159099999.csv" "2019-01-19 12:37" "20K" NA
7 "03262099999.csv" "2019-01-19 12:37" "20K" NA
8 "03311099999.csv" "2019-01-19 12:37" "19K" NA
9 "03379099999.csv" "2019-01-19 12:37" "33K" NA
10 "03396099999.csv" "2019-01-19 12:37" "21K" NA
# ... with 14 more rows
我正在尝试使用 R 中的 RCurl 包访问以下天气数据的 http 目录:
http://ncei.noaa.gov/data/global-summary-of-the-day/access/
每年的每个目录中都有一个唯一的气象站列表。
我可以像这样访问任何特定的数据集
url = 'http://ncei.noaa.gov/data/global-summary-of-the-day/access/1932/03005099999.csv'
data = read.csv(url)
但是,我无法在不知道每个目录中有哪些文件的情况下自动执行此过程。我试过使用 RCurl 包来获取其中所有文件的列表,但总是出现错误:
url = 'http://ncei.noaa.gov/data/global-summary-of-the-day/access/'
getURL(url)
这给了我以下输出,说明地址已更改(到 https 地址)
[1] "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>301 Moved Permanently</title>\n</head><body>\n<h1>Moved Permanently</h1>\n<p>The document has moved <a href=\"https://ncei.noaa.gov/data/global-summary-of-the-day/access/\">here</a>.</p>\n</body></html>\n"
将地址更改为 https url 指示会出现此错误
url = 'https://ncei.noaa.gov/data/global-summary-of-the-day/access/'
getURL(url)
Error in function (type, msg, asError = TRUE) : error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
我尝试将 https: 替换为 ftps: 和 ftp: 这样做会出现超时错误。
对打印目录有什么想法吗?
我认为这里的问题是服务器仅支持使用 TLS 1.2 版和您的 RCurl does not support it.
的请求您可以使用 httr
和 rvest
实现您想要的效果。例如,要获取列出 1929 目录中文件的小标题:
library(httr)
library(rvest)
url1 <- "https://www.ncei.noaa.gov/data/global-summary-of-the-day/access/1929"
page_data <- GET(url1)
files <- content(page_data, as = "parsed") %>%
html_table() %>%
.[[1]]
files
# A tibble: 24 x 4
Name `Last modified` Size Description
<chr> <chr> <chr> <lgl>
1 "" "" "" NA
2 "Parent Directory" "" "-" NA
3 "03005099999.csv" "2019-01-19 12:37" "20K" NA
4 "03075099999.csv" "2019-01-19 12:37" "20K" NA
5 "03091099999.csv" "2019-01-19 12:37" "17K" NA
6 "03159099999.csv" "2019-01-19 12:37" "20K" NA
7 "03262099999.csv" "2019-01-19 12:37" "20K" NA
8 "03311099999.csv" "2019-01-19 12:37" "19K" NA
9 "03379099999.csv" "2019-01-19 12:37" "33K" NA
10 "03396099999.csv" "2019-01-19 12:37" "21K" NA
# ... with 14 more rows