You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R的xml2包爬取IGRF数据至已有离线DataFrame的问题

解决IGRF磁模型数据爬取的效率与数据整合问题

问题描述

你需要从IGRF磁模型计算器爬取总强度和倾角数据,整合到包含日期、经纬度的已有DataFrame中(该DataFrame涵盖2012-2022年共24000条观测记录)。当前采用for循环实现时遇到两个问题:

  • 爬取结果存入独立列表,无法直接对应到DataFrame的Intensity和Inclination列
  • 循环运行至约2500条时出现超时,整体效率极低

解决方案

核心优化思路

  1. 用批量请求替代单条循环:降低请求频率避免触发服务器限制,同时提升处理速度
  2. 直接在DataFrame内生成目标列:跳过独立列表的中间步骤,直接将结果整合到原数据中

完整实现代码

library(tidyverse)
library(httr)
library(xml2)

# 第一步:清理原始数据,过滤掉经纬度为NA的记录
DF_clean <- DF %>% filter(!is.na(Latitude) & !is.na(Longitude))

# 定义单个坐标点的IGRF数据请求函数
fetch_igrf <- function(lat, lon, year) {
  base_url <- "https://www.ngdc.noaa.gov/geomag-web/calculators/calculateIgrfwmm?"
  # 构造请求参数,避免手动拼接URL出错
  request_params <- list(
    lat1 = lat,
    lon1 = lon,
    model = "IGRF",
    startYear = year,
    endYear = year,
    key = "EAU2y",
    resultFormat = "xml"
  )
  
  # 添加请求延迟,降低服务器压力,避免超时
  Sys.sleep(0.1)
  # 发送GET请求
  resp <- GET(base_url, query = request_params)
  
  # 解析响应并提取目标值
  if (http_status(resp)$category == "Success") {
    xml_content <- read_xml(content(resp, "text"))
    intensity <- as.numeric(xml_text(xml_find_all(xml_content, "//totalintensity")))
    inclination <- as.numeric(xml_text(xml_find_all(xml_content, "//inclination")))
    return(tibble(Intensity = intensity, Inclination = inclination))
  } else {
    # 请求失败时返回NA,保证流程不中断
    return(tibble(Intensity = NA_real_, Inclination = NA_real_))
  }
}

# 第二步:批量处理并整合到原DataFrame
DF_final <- DF_clean %>%
  # 处理每行的经纬度和年份
  mutate(igrf_result = pmap(list(Latitude, Longitude, Year), fetch_igrf)) %>%
  # 将嵌套的结果展开为列
  unnest(igrf_result)

关键优化说明

  • 请求频率控制:加入Sys.sleep(0.1)让每次请求间隔0.1秒,避免短时间内大量请求触发服务器的超时限制
  • 参数化请求:用httr::GET的query参数构造请求,比手动拼接URL更安全,不易出错
  • 错误容错:增加请求状态判断,失败时返回NA,不会因为单条请求失败导致整个流程终止
  • 数据直接整合:通过pmap+unnest直接在DataFrame中生成目标列,无需手动维护独立列表,减少代码冗余

内容的提问来源于stack exchange,提问作者Jadyn S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:50:16