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

心靈之曲
发布: 2025-09-22 13:33:52
原创
634人浏览过

使用 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() 方法,让启动的浏览器实例访问目标网页。

怪兽AI数字人
怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44
查看详情 怪兽AI数字人
# 导航到目标 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 是一个不可或缺的工具。正确理解其工作原理并遵循资源清理的最佳实践,将确保您的数据抓取过程高效且稳定。

以上就是使用 RSelenium 从动态 PHP 网站提取表格数据到 R 数据框的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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