无法抓取USEPA饮用水化学品标准公开数据:‘failed to load HTTP resource’错误
解决USEPA饮用水标准表格抓取失败的问题
你尝试用XML包抓取USEPA那包含122种化学品的饮用水标准表格,结果跑代码的时候直接弹出Error: failed to load HTTP resource的错误,对吧?我来给你分析下问题出在哪,以及怎么解决。
问题根源分析
- 首先你用的是HTTP协议的链接,现在很多政府网站都强制要求HTTPS访问,直接发HTTP请求大概率会被服务器拒绝。
- 另外XML包的
readHTMLTable工具比较老旧,对现代网页的兼容性不太好,比如遇到带JS渲染的页面或者简单的反爬机制就容易卡壳。
解决方案一:先换HTTPS链接试试基础调整
先把URL换成HTTPS版本,先不指定列类型,看看能不能正常读取:
library(XML) url <- "https://www.epa.gov/wqc/national-recommended-water-quality-criteria-human-health-criteria-table" # 先跳过colClasses,先确认能不能抓到数据 USEPA <- readHTMLTable(url, which = 1, stringAsFactors = FALSE) # 看看前几行数据 head(USEPA)
如果这个方法还是不行,那咱们换个更靠谱的工具——rvest包,它专门针对现代网页抓取设计,兼容性强很多。
解决方案二:用rvest包实现稳定抓取
rvest是R里现在主流的网页抓取工具,步骤很简单:
- 先安装并加载需要的包:
install.packages("rvest") library(rvest) # 可选加载dplyr,方便后续整理数据 library(dplyr)
- 抓取网页并提取目标表格:
url <- "https://www.epa.gov/wqc/national-recommended-water-quality-criteria-human-health-criteria-table" # 读取网页内容 page <- read_html(url) # 提取页面里的第一个表格(就是咱们要的标准表格) table_data <- page %>% html_table(header = TRUE, trim = TRUE) %>% .[[1]] # 查看数据结构,确认抓取成功 str(table_data)
- 按需调整列类型:
抓取到数据后,你可以根据自己的需求把列转换成对应类型,比如数值列转成numeric,整数列转成integer:
table_data <- table_data %>% mutate(across(c(3,4), as.numeric)) %>% # 假设第3、4列是数值型 mutate(across(c(2,5), as.integer)) # 假设第2、5列是整数型
额外小技巧
如果遇到服务器返回403禁止访问的错误,大概率是网站的反爬机制把你当成机器人了,这时候可以给请求加个浏览器的User-Agent头,模拟正常用户访问:
page <- read_html(url, user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
另外记得抓取前看看网站的robots.txt规则,确保咱们的抓取行为符合网站的使用规范哦。
内容的提问来源于stack exchange,提问作者user11036517
相关产品推荐
相关产品推荐

