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

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

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

Cutout.Pro

AI驱动的视觉设计平台

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

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

# 导航到目标 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 数据框的详细内容,更多请关注css php javascript java html node windows 操作系统 浏览器 app 端口 工具 Java php JavaScript firefox css chrome html xml 对象 选择器 windows 自动化

大家都在看:

css php javascript java html node windows 操作系统 浏览器 app 端口 工具 Java php JavaScript firefox css chrome html xml 对象 选择器 windows 自动化

app
上一篇
下一篇