解决htmltab‘no table found’错误的循环爬取容错方案问询
解决无效URL导致爬虫循环中断的问题
我之前也遇到过类似的爬虫问题,这种因无效URL导致循环中断的情况确实很头疼。解决的核心思路是给你的htmltab调用加上错误捕获机制,让程序遇到错误时跳过当前请求,继续执行后续循环。下面给你两种实用的解决方案:
方法1:使用Base R的tryCatch函数
tryCatch是Base R自带的错误处理工具,可以让你指定当代码抛出错误时应该执行的操作。你可以把htmltab的调用包裹在tryCatch里,当URL无效时返回NULL(或者一个空数据框),同时可以打印错误信息用于调试。
修改后的代码如下:
library(htmltab) tables <- list() for (i in 0:1548) { for (j in 0:16) { for (k in 0:4) { a <- i+1 b <- 2003+j c <- k+1 url <- paste("https://basketball.realgm.com/ncaa/conferences/Big-Ten-Conference/2/Michigan/",a,"/individual-games/",b,"/minutes/Season/desc/",c,sep = "") # 用tryCatch捕获错误 safe_tab <- tryCatch( expr = htmltab(url, rm_nodata_cols = F, which = 1), error = function(e) { # 可选:打印错误信息和当前的参数,方便调试 message(paste("Failed to scrape:", url, "\nError message:", e$message)) return(NULL) # 出错时返回NULL } ) tables[[paste(i,j,k,sep = "")]] <- safe_tab } } } # 最后过滤掉列表中的NULL元素,合并有效数据 library(dplyr) final_data <- bind_rows(tables)
方法2:使用purrr包的possibly函数(更简洁)
如果你习惯使用tidyverse工具链,purrr::possibly可以帮你快速创建一个“安全版”的函数——当原函数出错时,它会返回你指定的默认值,而不是抛出错误终止程序。
代码示例:
library(htmltab) library(purrr) tables <- list() # 创建安全版的htmltab函数,出错时返回NULL safe_htmltab <- possibly(htmltab, otherwise = NULL) for (i in 0:1548) { for (j in 0:16) { for (k in 0:4) { a <- i+1 b <- 2003+j c <- k+1 url <- paste("https://basketball.realgm.com/ncaa/conferences/Big-Ten-Conference/2/Michigan/",a,"/individual-games/",b,"/minutes/Season/desc/",c,sep = "") # 直接调用安全版函数,无需额外处理 tables[[paste(i,j,k,sep = "")]] <- safe_htmltab(url, rm_nodata_cols = F, which = 1) # 可选:打印当前进度,方便跟踪 message(paste("Processing: i=",i," j=",j," k=",k)) } } } # 合并有效数据 final_data <- dplyr::bind_rows(tables)
额外提示
- 建议添加进度打印(比如方法2里的
message),这样你能清楚知道循环执行到哪一步,也能快速定位哪些URL是无效的。 - 如果某些URL返回的是空表格而不是直接报错,你可以在添加到列表前判断数据框的行数,只保留有数据的条目。
内容的提问来源于stack exchange,提问作者Anthony Amico
相关产品推荐
相关产品推荐

