遍历列表网页爬取遇404错误的处理方案咨询
问题解决:爬取邮编信息时跳过无效项并记录错误
问题背景
爬取澳大利亚邮编对应郊区信息时,使用的外部邮编列表包含无效项,访问不存在的页面会触发Error in open.connection(x, "rb") : HTTP error 404.错误,导致循环中断,需手动删除无效项后重启,希望能自动记录错误行并继续执行循环。
原代码:
postcodes <- read.csv("C:/postcode list.csv") data <- data.frame(matrix(ncol = 7, nrow = 0)) for (i in 1:nrow(postcodes)){ url <- paste0("https://www.domain.com.au/suburb-profile/",postcodes[i,]) page <- read_html(url) contentnodes <- page %>% html_element("div.css-0") %>% html_table() %>% `[`(-1) contentnodes$suburb <- paste0(postcodes[i,]) data <- rbind(data,contentnodes) print(i) Sys.sleep(6) }
优化方案
使用tryCatch捕获请求和解析过程中的错误,同时记录出错的行号,让循环继续执行。具体修改如下:
postcodes <- read.csv("C:/postcode list.csv") # 初始化存储数据的data.frame和错误记录向量 data <- data.frame(matrix(ncol = 7, nrow = 0)) error_rows <- c() for (i in 1:nrow(postcodes)){ tryCatch({ url <- paste0("https://www.domain.com.au/suburb-profile/", postcodes[i,]) page <- read_html(url) contentnodes <- page %>% html_element("div.css-0") %>% html_table() %>% `[`(-1) contentnodes$suburb <- paste0(postcodes[i,]) data <- rbind(data, contentnodes) print(paste("成功爬取第", i, "行")) }, error = function(e) { # 记录错误行号和错误信息 error_rows <<- c(error_rows, i) print(paste("第", i, "行爬取失败,错误信息:", e$message)) }) Sys.sleep(6) } # 循环结束后输出错误行 print("爬取完成,出错的行号:") print(error_rows) # 可选:将错误行保存到文件 write.csv(data.frame(error_row = error_rows), "C:/error_postcodes.csv", row.names = FALSE)
关键说明
tryCatch块包裹单次爬取的所有操作,出现404或其他错误时,会执行error分支代码,记录错误行号且不中断循环- 新增
error_rows向量专门存储出错行号,循环结束后可统一处理这些无效项 - 优化打印信息,方便实时查看爬取状态
- 可选择将错误行导出到文件,后续直接从原邮编列表中删除这些行即可
内容的提问来源于stack exchange,提问作者user12025050
相关产品推荐
相关产品推荐

