0

0

R语言进阶网页抓取:处理JavaScript动态加载的数据

聖光之護

聖光之護

发布时间:2025-08-08 21:04:28

|

849人浏览过

|

来源于php中文网

原创

R语言进阶网页抓取:处理JavaScript动态加载的数据

本文旨在教授如何使用R语言处理通过JavaScript动态加载的网页数据。针对传统网页抓取工具(如XML或rvest)无法直接获取此类数据的挑战,文章将详细介绍如何利用V8包模拟JavaScript执行环境,直接从JavaScript文件中提取所需数据。通过一个具体的案例,我们将演示如何识别数据源、获取JavaScript内容、在R环境中运行JavaScript代码,并对提取的数据进行清洗和整理,从而高效、准确地获取动态生成的网页信息。

1. 动态网页数据抓取的挑战

在网页数据抓取(web scraping)中,我们经常会遇到数据并非直接嵌入在html结构中,而是通过javascript动态生成的情况。传统的r包,如xml或rvest,主要依赖于解析静态html内容。当目标数据通过javascript异步请求(ajax)或直接内嵌在javascript变量中时,这些工具往往无法直接获取到所需信息。

以从https://www.fatf-gafi.org/countries/网站抓取国家列表为例,初步尝试使用XML::htmlParse可能无法获取到预期的国家数据,因为这些数据并非以标准HTML表格(

)的形式存在,而是嵌套在
元素中,且由JavaScript动态填充。在这种情况下,我们需要一种能够执行JavaScript代码并访问其内部变量的解决方案。

2. 解决方案:利用V8包执行JavaScript

R语言的V8包提供了一个嵌入式JavaScript和WebAssembly引擎,允许我们在R环境中执行JavaScript代码,并与JavaScript运行时环境进行交互。这意味着我们可以加载网页中使用的JavaScript文件,执行其中的代码,然后提取在JavaScript中定义的变量值。

核心思路:

  1. 识别JavaScript数据源: 通过浏览器开发者工具(Network/网络标签页)检查网页加载过程中请求的资源,特别是.js文件,寻找可能包含目标数据的JavaScript文件。
  2. 获取JavaScript内容: 使用httr包下载该JavaScript文件的内容。
  3. 初始化V8引擎: 创建一个V8上下文。
  4. 执行JavaScript代码: 将下载的JavaScript内容在V8上下文中执行。
  5. 提取变量: 从V8上下文中获取JavaScript变量的值。
  6. 数据清洗: 对提取到的数据进行必要的格式转换和清洗。

3. 实战案例:抓取FATF网站的国家数据

我们将以FATF(金融行动特别工作组)网站为例,演示如何抓取其国家列表。

立即学习Java免费学习笔记(深入)”;

Bika.ai
Bika.ai

打造您的AI智能体员工团队

下载

3.1 识别数据源

通过访问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。

3.2 实施步骤与代码示例

首先,确保你已经安装了所需的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) # 查看数据结构

3.3 代码解释

  • httr::GET() 和 content(): 用于发起HTTP GET请求并获取响应内容。'text'参数确保内容被解析为字符串。
  • v8(): 创建一个V8引擎实例,它提供了一个独立的JavaScript运行环境。
  • ct$eval(js_content): 这是核心步骤。它将从网站下载的JavaScript代码在V8引擎中执行。执行后,该JavaScript代码中定义的任何全局变量(例如本例中的countries)都可以在R中访问。
  • ct$get("countries"): 从V8引擎中提取名为countries的JavaScript变量的值。V8包会自动将其转换为R中对应的数据结构(通常是列表或数据框)。
  • unnest(cols = c(groups)): 观察到ct$get("countries")返回的数据框中,有一列名为groups,其内部是一个嵌套的列表或数据框。unnest()函数(来自tidyr包)用于将这些嵌套结构展开为扁平的列,使得数据更易于分析。
  • select(c(1:2, 4:14, 16)): 经过unnest操作后,数据框可能包含多余的列或者需要重新排列的列。这里通过列索引选择最终需要的列。在实际应用中,建议先打印names(final_country_data)或使用glimpse()来查看所有列名,然后按名称选择,以提高代码的可读性和健壮性。
  • filter(!is.na(name)): 过滤掉name列为NA(缺失值)的行。在某些数据源中,末尾可能会有填充的空行,通过这种方式可以清除。

4. 注意事项与总结

  • JavaScript源定位: 找到正确的JavaScript文件是关键。熟练使用浏览器开发者工具(尤其Network/网络和Sources/源标签页)是必备技能。
  • 数据结构探索: 从V8中获取的数据可能是一个复杂的嵌套列表。使用str()、names()、glimpse()等函数来探索其结构,以便正确地使用unnest()、select()等函数进行数据清洗。
  • 动态内容复杂性: 并非所有动态内容都能通过V8直接提取。如果数据是通过复杂的DOM操作、用户交互或加密方式加载,可能需要更高级的工具,如selenium配合无头浏览器进行模拟。但对于数据直接存在于某个JavaScript变量中的情况,V8是一个轻量且高效的选择。
  • 网站政策: 在进行任何网页抓取活动前,请务必查阅网站的robots.txt文件和使用条款,确保你的行为符合网站的规定。

通过本文的学习,你应该能够掌握使用R语言V8包处理JavaScript动态加载数据的基本方法。这种技术极大地扩展了R在网页数据抓取方面的能力,使其能够应对更复杂的现代网页结构。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

159

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

160

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

117

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

234

2024.09.24

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1900

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2091

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1064

2024.11.28

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5.1万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号