R中修复通过ipleak.net批量获取IP城市信息存入DataFrame的错误
问题修复方案
错误根因
- 代码存在语法错误:URL拼接语句写法错误,无法生成合法的查询地址
- 未做请求频率控制:短时间批量请求触发网站反爬机制,返回504网关超时错误
- 变量名引用错误:解析表格时调用了未定义的
table2变量 - 无异常捕获逻辑:单个IP查询失败会直接中断整个批量任务
修正后完整代码
if (!require("pacman")) install.packages("pacman") pacman::p_load( dplyr, rvest, purrr, tidyr ) # 提取待查询IP并统计原始出现次数 ip_count <- threedsecure_authentication_report_tidy %>% count(shopper_ip, name = "Number of Occurrences") ip_range <- unique(trimws(ip_count$shopper_ip)) # 批量查询IP地理信息 ip_geo <- purrr::map_df(ip_range, ~ { # 控制请求频率,间隔1.5秒,可根据实际情况调整 Sys.sleep(1.5) url_reviews <- paste0("https://ipleak.net/?q=", .x) # 异常捕获:查询失败返回NA,不中断整体任务 tryCatch({ page <- read_html(url_reviews) tbls <- html_nodes(page, "table") tbls_df <- html_table(tbls)[[1]] # 取返回的第一个表格 # 提取IP和城市信息 res <- data.frame( IP = tbls_df[1, 2], CITY = tbls_df[7, 2] ) return(res) }, error = function(e) { # 打印失败的IP方便后续排查 message(paste0("查询失败:", .x, ",错误信息:", e$message)) return(data.frame( IP = .x, CITY = NA_character_ )) }) }) # 关联出现次数,生成最终结构的表 final_result <- ip_geo %>% left_join(ip_count, by = c("IP" = "shopper_ip"))
关键修改说明
- 增加
Sys.sleep控制请求间隔,避免触发网站访问频率限制 - 补充
tryCatch异常捕获逻辑,单个IP查询失败不会中断整体流程,同时输出失败日志方便排查 - 修正了变量名、URL拼接的语法错误
- 提前统计IP的出现次数,最后关联生成要求的
IP/CITY/Number of Occurrences结构的输出表
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

