如何使用rvest爬取AEA网页下拉表格内的JEL分类关键词?
问题原因
该页面的表格内容属于动态渲染内容:初始静态HTML仅返回表头结构,分类条目、下拉关键词等内容要么是页面加载完成后通过JS异步请求填充,要么需要点击折叠按钮才会插入到DOM中,因此直接用rvest抓取静态源码只能拿到表头,无法获取内部条目内容。
解决方案1:动态渲染爬取
使用支持JS运行的浏览器模拟工具加载页面,等全部内容渲染完成后再提取数据。推荐用轻量的chromote包,无需复杂的Selenium环境配置,示例代码如下:
- 先安装依赖包:
install.packages(c("chromote", "rvest", "dplyr"))
- 爬取代码:
library(chromote) library(rvest) library(dplyr) # 启动无头浏览器实例,加载目标页面 b <- ChromoteSession$new() b$Page$navigate("https://www.aeaweb.org/jel/guide/jel.php") # 等待页面加载完成,网络差可以适当调大数值 Sys.sleep(3) # 模拟点击所有折叠按钮,展开全部下拉内容,可根据页面实际按钮类名修改选择器 b$Runtime$evaluate(" document.querySelectorAll('.jel-expandable').forEach(el => el.click()); ") # 等待内容全部展开 Sys.sleep(2) # 获取渲染完成的完整页面源码 full_html <- b$Runtime$evaluate("document.documentElement.outerHTML")$result$value %>% read_html() # 方案A:提取所有表格内容 all_tables <- full_html %>% html_table(fill = TRUE) # 方案B:直接提取所有以Keywords:开头的行文本 keywords_lines <- full_html %>% html_elements("tr") %>% html_text2() %>% grep("^Keywords:", ., value = TRUE) # 关闭浏览器进程 b$close()
解决方案2:使用官方静态数据集(更稳定)
AEA官方公开了完整的JEL分类静态数据集,包含所有层级分类编码、分类名称、对应关键词,不需要爬取直接读取即可,比动态爬取效率高、稳定性强,支持CSV、JSON等多种格式,直接用read.csv()或jsonlite::read_json()就能解析。
内容的提问来源于stack exchange,提问作者Marco Repetto
相关产品推荐
相关产品推荐

