You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R的rvest/httr爬取页面时read_html返回近乎空对象的问题

问题原因及解决方案

核心原因分析

你遇到的情况是服务器返回状态码200(请求成功),但实际返回内容存在以下几种可能,导致rvest无法解析出有效DOM结构:

  • 被网站反爬策略识别为非浏览器请求,返回了仅含基础框架的空壳HTML
  • 返回内容的编码与rvest默认解析编码不匹配,导致解析失败
  • 页面内容依赖JavaScript动态渲染,静态请求无法获取到实际加载的内容

调用过程中的细节

  1. 使用httr::GET()发送请求时,默认请求头(如libcurl/xxx r-curl/xxx httr/xxx)会被网站识别为爬虫请求,返回的内容看似有大小,但仅包含无实际数据的HTML标签框架
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 17:09:59