
在网页数据抓取(web scraping)中,我们经常会遇到数据并非直接嵌入在html结构中,而是通过javascript动态生成的情况。传统的r包,如xml或rvest,主要依赖于解析静态html内容。当目标数据通过javascript异步请求(ajax)或直接内嵌在javascript变量中时,这些工具往往无法直接获取到所需信息。
以从https://www.fatf-gafi.org/countries/网站抓取国家列表为例,初步尝试使用XML::htmlParse可能无法获取到预期的国家数据,因为这些数据并非以标准HTML表格(<table>)的形式存在,而是嵌套在<div>元素中,且由JavaScript动态填充。在这种情况下,我们需要一种能够执行JavaScript代码并访问其内部变量的解决方案。
R语言的V8包提供了一个嵌入式JavaScript和WebAssembly引擎,允许我们在R环境中执行JavaScript代码,并与JavaScript运行时环境进行交互。这意味着我们可以加载网页中使用的JavaScript文件,执行其中的代码,然后提取在JavaScript中定义的变量值。
核心思路:
我们将以FATF(金融行动特别工作组)网站为例,演示如何抓取其国家列表。
立即学习“Java免费学习笔记(深入)”;
通过访问https://www.fatf-gafi.org/countries/并打开浏览器开发者工具,在“网络”或“Network”标签页中,我们可以观察到页面加载过程中会请求一个名为country-data-multi-lang.js的JavaScript文件。经验证,这个文件包含了我们所需的所有国家数据,以一个名为countries的JavaScript数组变量形式存在。
该JavaScript文件的完整URL通常是:https://www.fatf-gafi.org/media/fatf/fatfv20/js/country-data-multi-lang.js。
首先,确保你已经安装了所需的R包:httr、V8、dplyr和tidyr。
# 载入所需库
library(httr) # 用于发送HTTP请求
library(V8) # 用于执行JavaScript
library(dplyr) # 用于数据操作
library(tidyr) # 用于数据整理,特别是unnest函数
# 1. 定义JavaScript数据文件的URL
js_url <- 'https://www.fatf-gafi.org/media/fatf/fatfv20/js/country-data-multi-lang.js'
# 2. 使用httr包获取JavaScript文件的内容
# content(GET(js_url), 'text') 将GET请求的响应内容解析为文本
js_content <- content(GET(js_url), 'text')
# 3. 初始化V8上下文
# ct <- v8() 创建一个新的V8引擎上下文
ct <- v8()
# 4. 在V8上下文中执行JavaScript代码
# ct$eval(js_content) 会执行js_content中的所有JavaScript代码
# 这将使得js_content中定义的变量(例如'countries')在V8上下文中可用
ct$eval(js_content)
# 5. 从V8上下文中提取'countries'变量的值
# ct$get("countries") 将JavaScript中的'countries'变量转换为R的数据结构
# 经验证,'countries'是一个嵌套的数据结构,其中'groups'列是列表形式
country_data_raw <- ct$get("countries")
# 6. 数据清洗与整理
# 使用tidyr::unnest() 将嵌套的'groups'列展开
# select() 选择我们感兴趣的列。这里的列索引是根据实际数据结构确定的,
# 建议在实际操作中先查看数据框的列名和结构,再进行选择。
# filter(!is.na(name)) 过滤掉name列为NA的行,通常这些是无效或填充行。
final_country_data <- country_data_raw %>%
unnest(cols = c(groups)) %>% # 展开嵌套的 'groups' 列
select(c(1:2, 4:14, 16)) %>% # 选择特定列,这些列包含了国家名称、代码及相关组织信息
filter(!is.na(name)) # 过滤掉国家名称为空的行
# 查看最终的数据结构和前几行
print(final_country_data)
# str(final_country_data) # 查看数据结构通过本文的学习,你应该能够掌握使用R语言V8包处理JavaScript动态加载数据的基本方法。这种技术极大地扩展了R在网页数据抓取方面的能力,使其能够应对更复杂的现代网页结构。
以上就是R语言进阶网页抓取:处理JavaScript动态加载的数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号