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

使用Rvest爬取返回character(empty),排查是否为反爬或JS/JSON问题

问题分析与解决

首先,character(empty)的结果可能由两种原因导致,结合你提供的代码和RateMyProfessors网站的特性,逐一排查:

1. 网站反爬或robots.txt限制

先查看paths_allowed()的返回值:

  • 如果返回FALSE,说明该路径被robots.txt禁止爬取,网站明确阻止了你的请求。
  • 如果返回TRUE,则robots.txt允许访问,但仍可能存在UA识别这类反爬机制。

你可以尝试给请求添加浏览器UA头,避免被识别为爬虫:

library(httr)
library(rvest)

url <- "https://www.ratemyprofessors.com/search/teachers?query=*&sid=668htm"
# 模拟Chrome浏览器的UA
res <- GET(url, user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"))
njit <- read_html(res)
prof <- njit %>% xml_nodes(".cJdVEK") %>% html_text2()

2. JavaScript动态加载内容(最可能的原因)

RateMyProfessors的搜索结果是通过JavaScript动态渲染的,read_html()只能获取页面的静态HTML源码,而静态源码中并不包含.cJdVEK类的元素——你可以打开浏览器的「查看页面源代码」(不是开发者工具的Elements面板),搜索.cJdVEK,会发现没有匹配结果。

针对这种情况,有两种解决方案:

方案一:使用浏览器渲染工具(如playwright)

模拟真实浏览器执行JS后再获取内容:

install.packages("playwright")
library(playwright)
playwright_install() # 安装浏览器驱动

# 启动无头浏览器
pw <- chromium$launch(headless = TRUE)
page <- pw$new_page()
# 等待页面加载完成(networkidle表示网络请求稳定)
page$goto(url, wait_until = "networkidle")
# 获取渲染后的页面HTML
njit <- page$content() %>% read_html()
# 提取教授名称
prof <- njit %>% xml_nodes(".cJdVEK") %>% html_text2()
# 关闭浏览器
pw$close()

方案二:直接调用网站API(效率更高)

通过浏览器开发者工具的Network面板,找到RateMyProfessors用于加载搜索结果的API接口(通常是GraphQL请求),直接请求接口获取JSON数据,再解析提取所需信息。比如,搜索接口可能是POST请求到https://www.ratemyprofessors.com/graphql,携带包含学校ID(sid=668htm)的查询参数。

验证步骤

  1. 执行cat(html_text(njit))查看read_html()获取的静态内容,若内容中没有教授列表,而是加载提示或空白,说明是JS动态加载问题。
  2. 若静态内容包含反爬验证提示(如验证码),则说明被网站反爬机制拦截。

内容的提问来源于stack exchange,提问作者Jakiepoo21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:28:21