使用R的rvest包爬取指定时段新加坡气象局240km雷达图并打包Zip
解决方案
1. 核心思路拆解
你需要的雷达图URL遵循固定格式,可通过生成目标时间序列批量构造链接,再用rvest依赖的工具链实现无循环批量下载,最后打包为Zip文件。另外你找不到当日图的大概率原因是:新加坡气象局会定期清理历史雷达数据,2022年7月的部分数据可能已从服务器移除。
2. 完整实现代码(无for循环,基于rvest生态)
library(rvest) library(lubridate) library(stringr) library(purrr) library(utils) # 生成目标时间序列:2022-07-31 01:00 到 03:00,间隔5分钟 start_time <- ymd_hms("2022-07-31 01:00:00") end_time <- ymd_hms("2022-07-31 03:00:00") time_sequence <- seq(start_time, end_time, by = "5 mins") # 批量构造图片URL url_template <- "https://www.nea.gov.sg/docs/default-source/rain-area-240km/dpsri_240km_%sdBR.dpsri.png" image_urls <- map_chr(time_sequence, ~{ # 把时间格式化为URL需要的字符串:YYYYMMDDHHMMSS00 timestamp <- str_c( year(.), str_pad(month(.), 2, "left", "0"), str_pad(day(.), 2, "left", "0"), str_pad(hour(.), 2, "left", "0"), str_pad(minute(.), 2, "left", "0"), str_pad(second(.), 2, "left", "0"), "00" ) str_glue(url_template, timestamp) }) # 定义下载函数(带错误处理,跳过无效链接) download_single_image <- function(url) { tryCatch({ filename <- str_extract(url, "dpsri_240km_.*\\.png") # 用rvest底层依赖的httr实现文件下载 response <- httr::GET(url, httr::write_disk(filename, overwrite = TRUE)) if (httr::http_status(response)$category != "Success") { message(str_glue("跳过无效链接: {url}")) file.remove(filename) } else { message(str_glue("已下载: {filename}")) } }, error = function(e) { message(str_glue("下载失败 {url}: {e$message}")) }) } # 批量执行下载(用purrr::walk替代for循环) walk(image_urls, download_single_image) # 打包为Zip文件 image_files <- list.files(pattern = "dpsri_240km_20220731.*\\.png") zip("singapore_radar_20220731_0100_0300.zip", files = image_files) # 可选:删除单个图片,仅保留Zip包 # file.remove(image_files)
3. 关键细节说明
- 无循环实现:用
purrr::map_chr生成URL列表,purrr::walk执行批量下载,完全替代for循环,符合你的要求。 - 依赖说明:代码中用到的
lubridate/stringr/purrr属于tidyverse生态,httr是rvest的底层依赖,无需额外安装第三方包,满足“仅用rvest相关工具”的要求。 - 数据缺失问题:如果测试单个URL(比如
https://www.nea.gov.sg/docs/default-source/rain-area-240km/dpsri_240km_2022073101000000dBR.dpsri.png)在浏览器中也无法打开,说明该时段的雷达图已被官方清理,无法获取。
内容的提问来源于stack exchange,提问作者user19825372
相关产品推荐
相关产品推荐

