使用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)的查询参数。
验证步骤
- 执行
cat(html_text(njit))查看read_html()获取的静态内容,若内容中没有教授列表,而是加载提示或空白,说明是JS动态加载问题。 - 若静态内容包含反爬验证提示(如验证码),则说明被网站反爬机制拦截。
内容的提问来源于stack exchange,提问作者Jakiepoo21
相关产品推荐
相关产品推荐

