
在网页抓取(web scraping)任务中,我们经常会遇到数据并非直接嵌入在html结构中,而是通过javascript在客户端动态生成和渲染的情况。传统的r包如xml或rvest主要用于解析静态html内容,当目标数据位于javascript变量中或通过ajax请求加载时,这些工具往往无法直接获取到所需信息。
以从特定网站(如https://www.fatf-gafi.org/countries/)提取国家列表为例,如果尝试直接使用readLines和htmlParse,会发现页面上显示的“国家列表”数据并未出现在原始HTML源码中,而是通过页面加载后执行的JavaScript代码动态填充。这正是需要更高级抓取技术,如JavaScript执行环境的原因。
为了解决JavaScript动态加载数据的问题,我们可以利用R中的V8包。V8包提供了一个嵌入式的JavaScript和WebAssembly引擎,允许我们在R环境中直接执行JavaScript代码,并访问其执行结果。这意味着,如果目标数据存储在某个JavaScript变量中,我们可以在R中运行包含该变量的JavaScript代码,然后直接从V8引擎中提取该变量的值。
以下是使用V8包从动态网页中提取数据的具体步骤和R代码示例。
首先,我们需要确定包含目标数据的JavaScript文件或脚本。这通常需要检查网页的开发者工具(F12),在“网络”(Network)或“源代码”(Sources)标签页中查找加载的.js文件,或在HTML中查找内联的<script>标签。对于本例,通过分析发现,国家数据存储在一个名为country-data-multi-lang.js的JavaScript文件中。
立即学习“Java免费学习笔记(深入)”;
该文件的URL为:https://www.fatf-gafi.org/media/fatf/fatfv20/js/country-data-multi-lang.js。
我们需要httr用于发送HTTP请求获取JavaScript文件内容,V8用于执行JavaScript,以及dplyr和tidyr用于后续的数据清洗和整理。
library(httr) # 用于发送HTTP请求 library(V8) # 用于执行JavaScript library(dplyr) # 用于数据操作 library(tidyr) # 用于数据整理
使用httr::GET函数获取JavaScript文件的内容。content(..., 'text')确保我们以纯文本形式获取响应。
# 定义JavaScript文件的URL
js_url <- paste0('https://www.fatf-gafi.org/media/fatf/fatfv20/',
'js/country-data-multi-lang.js')
# 使用httr获取JavaScript文件的内容
js_content <- content(GET(js_url), 'text')创建一个V8上下文(context),然后使用ct$eval()方法执行获取到的JavaScript代码。执行后,JavaScript代码中定义的变量(例如countries)将存储在V8引擎的内存中。
# 创建一个V8上下文 ct <- v8() # 在V8上下文中执行JavaScript内容 ct$eval(js_content)
通过ct$get("variable_name")方法,我们可以从V8上下文中提取指定JavaScript变量的值。在本例中,目标变量是countries。提取出的数据通常是一个嵌套的列表结构,需要使用tidyr::unnest()、dplyr::select()和dplyr::filter()等函数进行扁平化、选择所需列和去除无效行。
# 从V8上下文中获取'countries'变量的值
# unnest() 用于展开嵌套的数据框列
# select() 用于选择需要的列
# filter() 用于移除不完整的行(例如,名称为NA的行)
extracted_data <- ct$get("countries") %>%
unnest(cols = c(groups)) %>%
select(c(1:2, 4:14, 16)) %>% # 根据实际数据结构选择列,这里选择了部分列
filter(!is.na(name))
# 打印提取并清洗后的数据的前几行
print(head(extracted_data))执行上述代码后,extracted_data将包含一个整洁的数据框,其中包含了从网站动态加载的各国信息,包括国家名称、代码以及其所属的各种组织(如FATF、APG等)。
通过V8包,R语言用户能够有效地克服传统HTML解析器在处理动态网页内容时的局限性,从而扩展了R在网页抓取领域的应用范围。这种方法为从复杂、JavaScript驱动的网站中提取结构化数据提供了强大的能力。
以上就是使用R语言抓取动态网页数据:基于V8引擎的JavaScript内容提取的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号