0

0

R语言中动态网页数据抓取:利用V8包解析JavaScript生成内容

碧海醫心

碧海醫心

发布时间:2025-08-08 21:06:01

|

675人浏览过

|

来源于php中文网

原创

R语言中动态网页数据抓取:利用V8包解析JavaScript生成内容

本文旨在指导读者如何使用R语言高效地抓取由JavaScript动态生成的数据,特别是当传统HTML解析方法失效时。我们将通过一个实际案例,详细介绍如何利用httr包获取JavaScript源文件,并借助V8包在R环境中执行JavaScript代码,进而提取和整理所需数据。这种方法尤其适用于那些数据嵌入在JS文件或通过JS逻辑动态渲染的网页。

引言:动态网页抓取的挑战

在网页数据抓取(web scraping)领域,传统的方法通常依赖于解析html结构,例如使用r中的xml、rvest等包来识别

等标签并提取内容。然而,随着现代网页技术的发展,越来越多的网站采用javascript来动态加载或生成页面内容,即所谓的单页应用(spa)或客户端渲染。在这种情况下,当您直接下载html源代码时,可能只会得到一个骨架页面,而实际的数据内容并未包含在内,因为它们是在浏览器执行javascript后才呈现的。

例如,在尝试从https://www.fatf-gafi.org/countries/这类网站抓取国家列表时,如果发现数据并非直接存在于HTML的

标签中,而是嵌套在
结构中,并且在查看页面源代码时无法找到这些数据,那么很有可能这些数据是通过JavaScript动态加载的。此时,传统的HTML解析方法将无法奏效。

V8包:在R中执行JavaScript

为了克服动态网页抓取的挑战,我们需要一个能够在R环境中模拟浏览器执行JavaScript能力的工具。V8包正是为此而生。它提供了对Google V8 JavaScript引擎的R语言接口,允许用户在R中创建JavaScript上下文,执行JavaScript代码,并获取JavaScript环境中变量的值。这使得我们能够直接处理那些通过JavaScript加载或计算出的数据。

实施步骤:抓取动态加载的国家数据

以下我们将通过一个具体案例,演示如何利用httr和V8包抓取FATF网站上的国家数据。

步骤1:识别并获取JavaScript源文件

首先,我们需要确定包含目标数据的JavaScript文件。通常,这需要对网页进行一些检查(例如使用浏览器开发者工具的网络请求选项卡),以找出在页面加载过程中请求的JavaScript文件。对于FATF网站的案例,我们发现国家数据存储在一个名为country-data-multi-lang.js的JavaScript文件中。

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

使用httr包,我们可以像获取普通网页一样获取这个JavaScript文件的内容。

Type
Type

生成草稿,转换文本,获得写作帮助-等等。

下载
library(httr)
library(V8)
library(dplyr)
library(tidyr)

# 目标JavaScript文件的URL
js_url <- paste0('https://www.fatf-gafi.org/media/fatf/fatfv20/',
                 'js/country-data-multi-lang.js')

# 使用GET请求获取JavaScript文件内容
js_content <- content(GET(js_url), 'text')

# 此时js_content变量中包含了JavaScript代码的字符串

步骤2:初始化V8引擎并执行JS代码

获取到JavaScript代码后,我们需要在R中创建一个V8上下文(即一个独立的JavaScript运行环境),然后将这段JavaScript代码加载并执行。

# 创建一个V8上下文
ct <- v8()

# 在V8上下文中执行JavaScript代码
# 这将运行js_content中的所有JS语句,包括变量定义等
ct$eval(js_content)

执行ct$eval(js_content)后,js_content中定义的任何全局变量都将在ct这个V8上下文中可用。在我们的案例中,经过分析,我们知道所需数据存储在一个名为countries的JavaScript变量中。

步骤3:提取和整理数据

JavaScript代码执行完毕后,我们可以使用ct$get()方法从V8上下文中提取指定变量的值。V8包会自动将JavaScript的数据结构(如数组、对象)转换为R中对应的列表或数据框。由于countries变量是一个嵌套的数据结构,我们需要使用tidyr和dplyr进行进一步的整理。

# 从V8上下文中获取名为"countries"的变量
# V8会自动将其转换为R的数据结构,通常是嵌套的列表或数据框
country_data <- ct$get("countries")

# 对嵌套数据进行整理:
# 1. unnest(cols = c(groups)):展开'groups'列中的嵌套数据
# 2. select(c(1:2,4:14,16)):选择所需的列,这里根据实际输出进行调整
# 3. filter(!is.na(name)):过滤掉可能存在的空行或无效数据
final_data <- country_data %>% 
  unnest(cols = c(groups)) %>%
  select(c(1:2,4:14,16)) %>% # 根据实际数据结构调整列索引
  filter(!is.na(name))

# 查看最终整理好的数据
print(final_data)

完整代码示例:

library(httr)
library(V8)
library(dplyr)
library(tidyr)

# 1. 识别并获取JavaScript源文件
js_url <- paste0('https://www.fatf-gafi.org/media/fatf/fatfv20/',
                 'js/country-data-multi-lang.js')
js_content <- content(GET(js_url), 'text')

# 2. 初始化V8引擎并执行JS代码
ct <- v8()
ct$eval(js_content)

# 3. 提取和整理数据
final_data <- ct$get("countries") %>% 
  unnest(cols = c(groups)) %>%
  select(c(1:2,4:14,16)) %>% # 根据实际数据结构调整列索引
  filter(!is.na(name))

# 打印结果
print(final_data)

# 示例输出(部分)
#> # A tibble: 209 × 14
#>    name       code  FATF  APG   CFATF EAG   ESAAMLG GABAC GAFILAT GIABA MENAFATF
#>                          
#>  1 Afghanist… AF    ""    "mbr" ""    "obs" ""      ""    ""      ""    ""      
#>  2 Albania    AL    ""    ""    ""    ""    ""      ""    ""      ""    ""      
#>  3 Algeria    DZ    ""    ""    ""    ""    ""      ""    ""      ""    "mbr"   
#>  4 Andorra    AD    ""    ""    ""    ""    ""      ""    ""      ""    ""      
#>  5 Angola     AO    ""    ""    ""    "mbr" ""      ""    ""      ""    ""      
#> # … with 200 more rows, and 3 more variables: MONEYVAL ,
#> #   jurisdiction , id 

注意事项与最佳实践

  1. 适用场景: V8包非常适合处理数据直接嵌入在JavaScript文件中的情况,或者当JavaScript逻辑相对简单,不涉及复杂的DOM操作或异步请求时。对于需要模拟用户交互、处理大量AJAX请求或渲染完整页面的场景,可能需要更强大的工具,如R中的RSelenium(基于Selenium WebDriver的无头浏览器)。
  2. 查找数据源的技巧: 使用浏览器开发者工具是关键。在“网络”(Network)选项卡中,您可以监视页面加载时所有的HTTP请求,包括JavaScript文件。通常,文件名或响应内容会暗示其是否包含所需数据。您也可以在“元素”(Elements)选项卡中查看动态生成的HTML,并在“源”(Sources)选项卡中调试JavaScript代码以理解其逻辑。
  3. 数据后处理: V8包提取的数据通常是R中的列表或数据框。对于嵌套结构,tidyr包的unnest()函数是强大的工具,可以帮助您将嵌套数据展平为更易于分析的格式。dplyr则用于选择、过滤和转换数据。
  4. JavaScript变量名: 确保您ct$get()中使用的变量名与JavaScript文件中实际定义的变量名完全匹配。
  5. 编码: 在读取网页内容或JavaScript文件时,指定正确的编码(如encoding = "UTF-8")可以避免乱码问题。

总结

当传统基于HTML解析的网页抓取方法遇到瓶颈时,特别是在面对由JavaScript动态生成内容的现代网站时,V8包提供了一个强大而灵活的解决方案。通过在R环境中直接执行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等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

235

2024.09.24

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

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

1903

2024.04.01

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

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

2092

2024.08.01

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

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

1081

2024.11.28

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

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

81

2025.09.18

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行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号