使用R语言调用freegeoip接口获取IP地理信息时遇XML解析错误求助
问题原因与解决方案
错误根源:你使用的
freegeoip.net服务已经停止运营,现在访问该地址返回的是HTML错误页面,而非预期的XML数据,XML解析器因HTML标签不匹配抛出了Opening and ending tag mismatch错误。解决方案:替换为仍在提供服务的免费IP地理编码API,比如ip-api的XML接口,以下是修改后的可运行代码:
ips <- c(Louvre ="213.139.122.103", British.Museum ="195.224.71.221", Museo.del.Prado ="213.27.146.137", Grand.Egyptian ="163.121.93.15", Hermitage.Museum ="213.152.151.197", MBNA ="200.218.240.120", Sydney.Museum ="54.252.89.136", MOMA ="63.117.124.131") library(XML) library(httr) get.geocode <- function(ip) { # 返回IP对应的经纬度 # 替换为ip-api的XML接口 url <- "http://ip-api.com/xml" # 发送请求并指定IP参数 xml <- content(GET(url, query = list(query = ip)), type = "text/xml") # ip-api的XML标签为<lat>和<lon>,调整xpath匹配新结构 xpath <- c(lat="//lat", long="//lon") sapply(xpath, function(xp) as.numeric(xmlValue(xml[xp][[1]]))) } # ip-api免费版限制每分钟最多45次请求,添加延时避免触发限制 locs <- data.frame(t(sapply(ips, function(ip) { Sys.sleep(1) # 每次请求间隔1秒 get.geocode(ip) }))) print(locs)
- 补充说明:ip-api免费版有请求频率限制,若需要更高请求量,可查看其付费方案或更换其他符合需求的API。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

