在R中爬取HTML表格遇unknown protocol错误的解决咨询
嘿,我来帮你搞定这两个问题!先聊聊你碰到的unknown protocol错误,再一步步教你把德国气象站的数据爬成R里的data.frame~
一、解决R爬虫中的
unknown protocol错误 这个错误说白了就是R认不出你要访问的网址用的是什么网络协议,大概率是以下几种情况,对应解决办法给你列好了:
- 先检查URL的基础格式! 这是最容易踩的坑:确保你的网址开头是
http://或者https://,没有多余的空格、换行,也别把拼写搞错(比如写成htttp://或者漏写一个斜杠http:/)。比如你复制网址的时候不小心带了开头的空格,R就会懵圈,一定要仔细核对一遍。 - 转码特殊字符:如果网址里有中文、空格或者
&、%这类特殊符号,先用URLencode()转码,比如:raw_url <- "https://example.com/德国气象站数据" encoded_url <- URLencode(raw_url) - 处理代理问题:要是你在公司或校园网里,可能得设置代理才能访问外部网站。用
httr包就能搞定:library(httr) set_config(use_proxy("你的代理地址", 端口号)) # 比如 use_proxy("192.168.1.1", 8080) - 更新爬虫相关包:旧版本的
rvest、httr这类包可能有协议解析的bug,更新一下就好:update.packages(c("rvest", "httr", "XML"), ask = FALSE) - 手动获取页面内容:如果直接用
read_html()失败,试试先手动发请求再解析:library(httr) library(rvest) resp <- GET("你的目标URL") if (http_status(resp)$category == "Success") { page <- read_html(content(resp, "text")) } else { stop("请求失败:", http_status(resp)$message) }
二、爬取德国气象站数据到data.frame
德国气象局(DWD)是最靠谱的数据源,他们有超多公开的气象数据,既有HTML表格,也有CSV、NetCDF这类结构化文件。这里给你一套通用流程,你可以按需调整:
1. 先准备好工具
加载常用的R包:
library(rvest) library(dplyr) # 用来清洗数据超方便
2. 找好目标页面
比如我们爬取DWD公开的月度气温数据页面(替换成你需要的实际网址就行,比如某具体站点的历史数据页):
# 示例:DWD的月度气温历史数据索引页 url <- "https://opendata.dwd.de/climate_environment/CDC/observations_germany/climate/monthly/air_temperature/historical/" # 如果是具体站点的表格页,比如: # url <- "https://example-dwd-station-page.de/monthly-weather.html"
3. 提取表格数据
# 读取HTML页面 page <- read_html(url) # 提取页面里所有的表格,fill=TRUE用来处理不规则的表格 all_tables <- html_table(page, fill = TRUE) # 选你需要的表格(一般用索引[[1]]取第一个,多试几个索引总能找到) weather_df <- all_tables[[1]]
4. 清洗数据(必不可少的一步)
爬下来的表格往往有多余的表头、空行或者格式混乱,比如:
# 删掉全是空值的行 weather_df <- weather_df %>% filter(!if_all(everything(), is.na)) # 给列改个清晰的名字(根据实际表格内容调整) colnames(weather_df) <- c("观测日期", "平均气温", "最高气温", "最低气温") # 把字符型的温度转成数值型,方便后续分析 weather_df <- weather_df %>% mutate(across(c(平均气温, 最高气温, 最低气温), as.numeric))
5. 进阶:直接下载结构化数据
DWD很多时候会提供CSV格式的数据(打包成zip),直接下载读取更高效:
# 示例:下载某站点的气温历史数据压缩包 csv_url <- "https://opendata.dwd.de/climate_environment/CDC/observations_germany/climate/monthly/air_temperature/historical/tm_01085_195101_202312_hist.zip" # 临时下载文件并解压 temp_file <- tempfile() download.file(csv_url, temp_file) unzip(temp_file, exdir = "./weather_data") # 读取解压后的CSV文件(注意分隔符可能是分号,不是逗号) weather_csv_df <- read.csv("./weather_data/tm_01085_195101_202312_hist.txt", sep = ";", header = TRUE)
内容的提问来源于stack exchange,提问作者Andy.Jian
相关产品推荐
相关产品推荐

