如何用R下载指定时段240km雷达图、排查404错误并打包?
问题排查与解决方案
错误原因分析
你遇到的404错误主要来自两个核心问题:
- URL格式拼接错误:对比示例URL,你的代码生成的URL缺少关键部分:
- 分钟数未补零(比如
i=0时应该是00而非0) - 缺失时间串末尾的
0000dBR标识 - 示例URL的时间格式为
YYYYMMDDHHMM0000dBR,你的拼接逻辑完全不符合该规则
- 分钟数未补零(比如
- 错误使用
read_html:图片URL本身是直接的资源地址,不需要用read_html解析网页,直接请求资源即可。
修正后的代码实现
以下是包含正确生成URL、下载图片、打包为ZIP的完整可运行代码:
library(httr) library(zip) # 1. 生成目标时间序列:2022-07-31 01:00 到 03:00,间隔5分钟 start_time <- as.POSIXct("2022-07-31 01:00:00", tz = "Asia/Singapore") end_time <- as.POSIXct("2022-07-31 03:00:00", tz = "Asia/Singapore") time_sequence <- seq(start_time, end_time, by = "5 mins") # 2. 创建临时文件夹存放下载的图片 temp_dir <- tempfile(pattern = "radar_images_") dir.create(temp_dir) # 3. 循环下载每个时间点的图片 for (time_point in time_sequence) { # 格式化时间为URL所需的字符串:YYYYMMDDHHMM0000dBR time_str <- format(time_point, "%Y%m%d%H%M0000dBR") # 拼接完整URL img_url <- paste0("https://www.nea.gov.sg/docs/default-source/rain-area-240km/dpsri_240km_", time_str, ".dpsri.png") # 定义本地保存路径 save_path <- file.path(temp_dir, basename(img_url)) # 下载图片(跳过不存在的资源,避免程序中断) tryCatch({ GET(img_url, write_disk(save_path, overwrite = TRUE)) cat("已下载:", basename(img_url), "\n") }, error = function(e) { cat("下载失败(资源不存在):", basename(img_url), "\n") }) } # 4. 将所有图片打包为ZIP文件 zip_file <- "20220731_radar_images_240km.zip" zip(zip_file, files = list.files(temp_dir, full.names = TRUE)) cat("所有操作完成,ZIP文件已保存为:", zip_file, "\n")
代码说明
- 时间序列生成:用
seq生成精确时间点,避免手动拼接小时和分钟的出错概率 - URL格式化:用
format函数直接生成符合要求的时间字符串,确保格式完全匹配示例URL - 错误处理:用
tryCatch跳过不存在的资源(部分时间点可能无雷达图),避免程序中断 - ZIP打包:使用
zip包将所有下载图片打包为单个ZIP文件,方便存储与传输
内容的提问来源于stack exchange,提问作者user19825372
相关产品推荐
相关产品推荐

