
在进行网页数据抓取(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 的核心思想是启动一个浏览器实例,然后通过 R 代码控制这个实例进行导航、交互和获取页面内容。
立即学习“PHP免费学习笔记(深入)”;
使用 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 会尝试其他可用端口。
通过 browser$navigate() 方法,让启动的浏览器实例访问目标网页。
# 导航到目标 URL
browser$navigate("http://www.medindex.am/glossary/semantic_types/B2.2-disease-syndrome-pathologic-function.php")此时,浏览器会在后台打开并加载指定的页面。RSelenium 会等待页面加载完成,包括 JavaScript 脚本的执行。
一旦页面加载完毕,我们可以通过 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 提供了一个强大而灵活的解决方案,用于从动态加载内容的网页中抓取数据。通过模拟真实用户的浏览器行为,它能够处理 JavaScript 渲染的页面,从而获取传统方法无法获取的数据。虽然设置和清理过程比直接的 rvest 抓取更复杂,但对于复杂的网页抓取任务,RSelenium 是一个不可或缺的工具。正确理解其工作原理并遵循资源清理的最佳实践,将确保您的数据抓取过程高效且稳定。
以上就是使用 RSelenium 从动态 PHP 网站提取表格数据到 R 数据框的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号