循环使用GET请求遇“Could not resolve host: NA”错误求助
搞定API请求里的「Could not resolve host: NA」错误
嘿,咱们来解决你调用性别API时遇到的这个头疼问题。我扒了下你的代码,发现几个核心问题——这就是为啥换了API也没用的原因,一步步来修复:
先搞懂为啥出错
你碰到的错误是:
Error in curl::curl_fetch_memory(url, handle = handle) : Could not resolve host: NA
根源在这几个地方:
- 你的
mynamegenderfunction函数里直接用了mydata$NameGenderURL2[x],但lapply遍历的是namelist里的名字,x是名字字符串不是索引,这就导致生成的URL变成NA了 - 函数里没正确处理
GET请求的返回值,也没把结果返回出来,lapply根本拿不到有效数据 - 没处理空名字或者无效名字的情况,生成的URL自然会有问题
修复方案&完整代码
我用你给的genderize.io API做示例,重构后的代码更健壮,还加了错误处理:
library(httr) library(jsonlite) # 定义处理单个名字的函数,输入名字,返回名字+性别结果 get_gender <- function(name) { # 先跳过空名字,直接返回NA if (is.na(name) || trimws(name) == "") { return(list(name = name, gender = NA)) } # 动态生成API链接,用URLencode处理特殊字符(比如空格、大写) api_url <- URLencode(paste0("https://api.genderize.io/?name=", name)) # 用tryCatch捕获请求失败的情况,避免整个批量任务中断 tryCatch({ # 发送请求并解析JSON结果 response <- GET(api_url) result <- fromJSON(rawToChar(response$content)) # 如果返回的gender是NULL,就设为NA,统一格式 list( name = name, gender = ifelse(is.null(result$gender), NA, result$gender) ) }, error = function(e) { # 请求失败时打印提示,方便排查哪个名字出问题 message(paste("获取", name, "的性别失败:", e$message)) list(name = name, gender = NA) }) } # 你的名字列表示例 namelist <- c("kaan", "Joan", "homeblitz", "Flatmax", "BRYAN", "James", "Dion", "Flintu", "Adriana") # 批量处理所有名字 gender_results <- lapply(namelist, get_gender) # 把结果转换成数据框,方便后续分析 gender_df <- do.call(rbind, lapply(gender_results, as.data.frame)) # 查看结果 print(gender_df)
额外小贴士
- 如果用需要密钥的API(比如你最初用的gender-api.com),只要在URL里加上
&key=你的密钥就行,记得同样用URLencode处理 - 免费API大多有请求频率限制,批量请求时可以加个小延迟,比如在
lapply里加Sys.sleep(0.5),避免被API服务商封禁 - 先清洗你的名字数据:去掉空值、特殊字符,能减少很多无效请求
内容的提问来源于stack exchange,提问作者useR
相关产品推荐
相关产品推荐

