0

0

使用 RSelenium 从动态 PHP 网站提取表格数据到 R 数据框

心靈之曲

心靈之曲

发布时间:2025-09-22 13:33:52

|

651人浏览过

|

来源于php中文网

原创

使用 RSelenium 从动态 PHP 网站提取表格数据到 R 数据框

本教程详细介绍了如何利用 RSelenium 库从动态加载内容的 PHP 网站中提取表格数据并将其转换为 R 数据框。针对传统 rvest 或 XML 方法无法处理 JavaScript 渲染页面的问题,我们采用浏览器自动化技术,模拟用户访问并获取完整的页面源,从而准确抓取目标表格。文章提供了完整的 R 代码示例和操作步骤,并强调了环境配置与资源清理的重要性。

理解动态网页数据抓取挑战

在进行网页数据抓取(web scraping)时,我们经常会遇到内容通过 javascript 动态加载的网站。传统的 r 库,如 rvest 或 xml,通常依赖于直接获取页面的原始 html 源代码。然而,对于那些在浏览器端通过 javascript 渲染或填充内容的页面,原始源代码可能不包含我们所需的所有数据,特别是表格数据。例如,一个 php 网站可能在服务器端生成 html,但也可能包含客户端 javascript 逻辑来动态修改或添加内容。当尝试使用 get 请求获取页面并解析时,如果目标表格是动态加载的,则会抓取失败。

为了克服这一挑战,我们需要一种能够模拟真实浏览器行为的工具,即执行 JavaScript、等待内容加载完毕后再提取数据。RSelenium 库正是为此而生,它允许我们通过 R 代码控制一个真实的浏览器实例(如 Firefox 或 Chrome),从而实现对动态网页的自动化操作和数据抓取。

环境准备与库加载

在使用 RSelenium 之前,需要确保您的系统已安装 Java 开发环境(JDK)以及您选择的浏览器(如 Firefox 或 Chrome)及其对应的 WebDriver(例如,Firefox 需要 geckodriver)。RSelenium 会在后台启动一个 Selenium Server 来协调 R 和浏览器之间的通信。

首先,加载所需的 R 库:

library(RSelenium)
library(rvest)
library(xml2)

使用 RSelenium 自动化浏览器

RSelenium 的核心思想是启动一个浏览器实例,然后通过 R 代码控制这个实例进行导航、交互和获取页面内容。

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

1. 启动 Selenium Server 和浏览器客户端

使用 rsDriver 函数来启动 Selenium Server 并创建一个浏览器客户端。您可以指定要使用的浏览器类型、端口号等。

# 启动 RSelenium 驱动和客户端
# browser: 指定要使用的浏览器 (如 "firefox", "chrome")
# port: 指定 Selenium Server 监听的端口
# verbose: 是否输出详细日志
driver <- rsDriver(browser = "firefox", port = 4545L, verbose = FALSE) 
server <- driver$server   # 获取 Selenium Server 对象
browser <- driver$client  # 获取浏览器客户端对象

注意: 首次运行 rsDriver 时,它可能会自动下载所需的 WebDriver。如果遇到问题,请检查 Java 环境和 WebDriver 的安装情况。端口 4545L 是一个示例,如果该端口被占用,rsDriver 会尝试其他可用端口。

2. 导航到目标 URL

通过 browser$navigate() 方法,让启动的浏览器实例访问目标网页。

PPT.AI
PPT.AI

AI PPT制作工具

下载
# 导航到目标 URL
browser$navigate("http://www.medindex.am/glossary/semantic_types/B2.2-disease-syndrome-pathologic-function.php")

此时,浏览器会在后台打开并加载指定的页面。RSelenium 会等待页面加载完成,包括 JavaScript 脚本的执行。

3. 获取完整的页面源并提取表格

一旦页面加载完毕,我们可以通过 browser$getPageSource() 获取当前浏览器中渲染出的完整 HTML 源代码。这个源代码包含了所有动态加载的内容。然后,我们可以使用 xml2::read_html() 将其解析为 HTML 文档对象,并结合 rvest::html_table() 来提取页面中的所有表格。

# 获取浏览器中渲染出的完整页面源代码
doc <- xml2::read_html(browser$getPageSource()[[1]])

# 使用 rvest 提取页面中的所有表格
all.table <- rvest::html_table(doc)

html_table() 函数会返回一个列表,其中每个元素都是一个从 HTML 表格转换而来的数据框。通常,我们需要根据表格的内容或结构来判断哪个是目标表格。在本例中,目标数据位于列表的第二个元素。

# 访问并查看目标表格(例如,列表中的第二个表格)
target_table <- all.table[[2]]
print(target_table)

输出示例:

# A tibble: 22,397 x 4
# CUI      Term                              Dictionary SemanticType                 
# <chr>    <chr>                             <chr>      <chr>                        
# 1 C0003865 Arthritis, Adjuvant               NDFRT      Experimental Model of Disease
# 2 C0004426 avian sarcoma                     CSP        Experimental Model of Disease
# 3 C0004565 B16 Malignant Melanoma            NCI        Experimental Model of Disease
# ... (更多行)

完整代码示例

以下是整个过程的完整 R 代码:

library(RSelenium)
library(rvest)
library(xml2)

# 1. 启动 RSelenium 驱动和客户端
# 注意:首次运行可能需要下载 WebDriver,确保 Java 环境已安装
driver <- rsDriver(browser = "firefox", port = 4545L, verbose = FALSE) 
server <- driver$server
browser <- driver$client

# 2. 导航到目标 URL
browser$navigate("http://www.medindex.am/glossary/semantic_types/B2.2-disease-syndrome-pathologic-function.php")

# 3. 获取浏览器中渲染出的完整页面源代码
doc <- xml2::read_html(browser$getPageSource()[[1]])

# 4. 使用 rvest 提取页面中的所有表格
all.table <- rvest::html_table(doc)

# 5. 访问并查看目标表格(例如,列表中的第二个表格)
target_table <- all.table[[2]]
print(target_table)

# 6. 关闭 RSelenium 资源
browser$close()
server$stop()

# 7. 清理 Java 进程(如果需要,特别是 Windows 系统)
# 这有助于释放被 Selenium Server 占用的端口
# 请谨慎使用此命令,它会终止所有名为 java.exe 的进程
system("taskkill /im java.exe /f", intern = FALSE, ignore.stdout = FALSE)

注意事项与资源清理

  • 资源清理至关重要: RSelenium 会启动独立的进程(Selenium Server 和浏览器实例)。如果不正确关闭,这些进程可能会继续占用系统资源,特别是端口。因此,务必在完成操作后执行 browser$close() 和 server$stop()。
  • Java 进程清理: 在某些操作系统(尤其是 Windows)上,即使 server$stop() 之后,Java 进程可能仍然存在并占用端口。system("taskkill /im java.exe /f") 命令可以强制终止所有 java.exe 进程,从而彻底释放资源。但请注意,这会终止所有正在运行的 Java 应用程序,请谨慎使用。
  • WebDriver 版本: 确保您安装的 WebDriver 版本与您的浏览器版本兼容。rsDriver 通常会自动管理,但如果遇到启动问题,可以手动检查。
  • 端口冲突: 如果 rsDriver 报告端口已被占用,可以尝试指定不同的端口号,或者在关闭所有相关进程后重试。
  • 等待时间: 对于某些加载缓慢的页面,可能需要在 browser$navigate() 之后添加一个显式的等待时间(例如 Sys.sleep(5)),以确保所有内容都已加载完毕。
  • 表格定位: html_table() 会返回一个表格列表。如果页面中有多个表格,您可能需要通过表格的特征(如标题、列名、行数)来确定哪个是您需要的表格。xpathSApply 或 html_nodes 结合 CSS 选择器或 XPath 表达式可以更精确地定位特定表格。

总结

RSelenium 提供了一个强大而灵活的解决方案,用于从动态加载内容的网页中抓取数据。通过模拟真实用户的浏览器行为,它能够处理 JavaScript 渲染的页面,从而获取传统方法无法获取的数据。虽然设置和清理过程比直接的 rvest 抓取更复杂,但对于复杂的网页抓取任务,RSelenium 是一个不可或缺的工具。正确理解其工作原理并遵循资源清理的最佳实践,将确保您的数据抓取过程高效且稳定。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1059

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

840

2023.11.06

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

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

1949

2024.04.01

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

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

2119

2024.08.01

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

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

1171

2024.11.28

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1496

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1170

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

836

2023.08.01

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.8万人学习

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

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