使用R的rvest/httr爬取页面时read_html返回近乎空对象的问题
问题原因及解决方案
核心原因分析
你遇到的情况是服务器返回状态码200(请求成功),但实际返回内容存在以下几种可能,导致rvest无法解析出有效DOM结构:
- 被网站反爬策略识别为非浏览器请求,返回了仅含基础框架的空壳HTML
- 返回内容的编码与
rvest默认解析编码不匹配,导致解析失败 - 页面内容依赖JavaScript动态渲染,静态请求无法获取到实际加载的内容
调用过程中的细节
- 使用
httr::GET()发送请求时,默认请求头(如libcurl/xxx r-curl/xxx httr/xxx)会被网站识别为爬虫请求,返回的内容看似有大小,但仅包含无实际数据的HTML标签框架 rvest::read_html()解析这份空壳HTML时,由于没有可提取的有效节点,生成了近乎空的DOM对象,因此object.size(page)数值极小
解决方案
1. 模拟浏览器请求头(最常用的解决方法)
网站通常通过User-Agent识别请求来源,添加浏览器UA可绕过基础反爬:
link <- "https://reality.idnes.cz/s/?page=1" response <- httr::GET(link, httr::add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", `Accept-Language` = "en-US,en;q=0.9" )) page <- rvest::read_html(response)
2. 检查并指定正确编码
若返回内容编码混乱,先查看原始文本确认编码:
raw_content <- httr::content(response, as = "text") cat(raw_content)
再指定编码重新解析:
page <- rvest::read_html(response, encoding = "UTF-8") # 根据实际编码调整参数
3. 处理JavaScript动态渲染内容
如果页面内容需JS动态加载,需使用无头浏览器工具获取渲染后的HTML:
library(chromote) session <- ChromoteSession$new() session$Page$navigate(link) session$Page$loadEventFired() rendered_html <- session$Page$getDocument()$result$root$children[[1]]$outerHTML page <- rvest::read_html(rendered_html) session$close()
内容的提问来源于stack exchange,提问作者sketman
相关产品推荐
相关产品推荐

