使用R程序化提取动态网页文本:纽约时报互动文章数据预处理的可行性与入门方法咨询
关于NYT动态页面数据抓取的可行性与入门指引
问题概述
我正在制作一份数据预处理教程,数据源来自纽约时报的一篇互动文章。该网页所有文本均为动态加载,无硬编码内容,我不知从何入手。我已尝试使用rvest和xml2包进行操作,但无法判断是否取得进展。此前我通过复制粘贴结合Notepad++的正则表达式,得到了如下表格结构:
| Attack |
|---|
| Fake News |
| Fake News |
| A total disgrace |
| ... |
| A real nut job |
但我希望实现全程序化操作(无需复制粘贴)。我的核心问题是:以合理的工作量实现该目标是否可行?若可行,能否提供入门指引?
PS:我知道该问题可能存在重复,但由于现有解决方案差异较大,无法确定具体重复的是哪一问题。
可行性分析
答案是肯定的!动态加载的内容并非无法抓取,只是rvest/xml2这类工具只能解析静态HTML,无法执行页面中的JavaScript代码——而这正是该页面内容加载的核心方式。只要用工具模拟浏览器的渲染过程,就能获取到动态生成的内容,全程无需手动复制粘贴,工作量完全可控。
入门指引(基于R语言)
推荐使用chromote包(它是RSelenium的轻量替代,无需额外安装浏览器驱动,配置更简单),配合rvest和dplyr完成抓取与清洗:
- 安装并加载必备包
install.packages(c("chromote", "rvest", "dplyr")) library(chromote) library(rvest) library(dplyr)
- 启动浏览器会话并加载页面
# 启动无头Chrome会话(后台运行,不弹出浏览器窗口) b <- ChromoteSession$new() # 加载目标页面 b$Page$navigate("https://www.nytimes.com/interactive/2021/01/19/upshot/trump-complete-insult-list.html#") # 等待页面完全加载(给JS足够时间渲染内容,可根据网络情况调整等待时间) Sys.sleep(5) # 获取渲染后的完整HTML page_html <- b$Page$getDocument()$root$children[[1]]$outerHTML %>% read_html()
- 提取并整理数据
观察页面结构后,你会发现侮辱列表的每个条目都包含目标人物/机构和对应的攻击言论,通常包裹在特定的CSS选择器下(比如类名包含insult-item之类的元素)。以实际页面结构为例,提取逻辑大概是:
# 抓取所有侮辱条目 insult_items <- page_html %>% html_elements(".insult-item") # 这里的选择器需要根据实际页面调整 # 遍历条目,提取Target和Attack result_df <- purrr::map_dfr(insult_items, function(item) { target <- item %>% html_element(".insult-target") %>% html_text(trim = TRUE) attack <- item %>% html_element(".insult-quote") %>% html_text(trim = TRUE) tibble(Target = target, Attack = attack) }) # 查看结果 head(result_df)
- 关闭浏览器会话
b$close()
关键提示
- 如果
chromote安装或运行有问题,可以尝试RSelenium(需要下载对应浏览器的驱动程序,比如ChromeDriver),核心逻辑类似:模拟浏览器加载页面,获取渲染后的HTML再解析。 - 页面的CSS选择器可能会有变动,建议使用浏览器的“开发者工具”(F12)查看元素结构,找到准确的选择器。
- 注意不要频繁请求页面,避免触发网站的反爬机制,可适当增加等待时间。
内容的提问来源于stack exchange,提问作者Dominic Comtois
相关产品推荐
相关产品推荐

