
本教程旨在指导如何在不进行ui交互(如右键点击)的情况下,通过直接访问和解析web应用程序的底层json api,程序化地获取特定文件(如csv)的下载链接。该方法比传统的浏览器自动化(如rselenium)更为高效和稳定,适用于需要批量获取数据或避免直接触发文件下载的场景,并演示了如何使用r语言中的`httr2`和`tidyverse`包实现这一过程。
在进行网页数据抓取时,我们经常遇到需要获取文件下载链接但又不希望直接点击下载的情况。例如,某个链接点击后会立即触发文件下载,而不是跳转到可复制链接的页面。在这种场景下,传统的浏览器自动化工具(如RSelenium模拟右键操作)虽然可行,但往往效率较低且稳定性受限于页面渲染。更高效、更健壮的方法是直接与Web应用程序的后端API进行交互,通常这些API以JSON格式提供数据。
许多现代Web应用程序采用前后端分离的架构。这意味着网页上显示的数据通常不是直接嵌入在HTML中,而是通过JavaScript异步请求后端API获取的JSON数据动态渲染出来的。如果能直接访问这些JSON API,我们就可以绕过复杂的UI交互,直接获取所需的数据和链接。
对于本教程中的特定案例,目标是获取一个“CSV Summary”文件的下载链接。通过观察或利用浏览器开发者工具(Network tab),可以发现页面上的数据和链接可能来源于一个特定的JSON端点。
假设我们已经通过分析发现,页面上的“CSV Summary”链接的信息实际上是从一个JSON文件(例如:https://services.healthtech.dtu.dk/services/BepiPred-2.0/tmp/630F1ABF0000500259861910/results.json)中获取的。我们可以使用R语言的httr2包来发起HTTP请求并获取这个JSON数据。
首先,确保你已经安装并加载了tidyverse和httr2包。
# 安装(如果尚未安装)
# install.packages("tidyverse")
# install.packages("httr2")
# 加载所需包
library(tidyverse)
library(httr2)
# 定义JSON数据源URL
json_url <- "https://services.healthtech.dtu.dk/services/BepiPred-2.0/tmp/630F1ABF0000500259861910/results.json"
# 发送请求并获取JSON响应
json_response <- json_url %>%
request() %>%
req_perform() %>%
resp_body_json(simplifyVector = TRUE)
# 打印JSON数据结构以供查看
print(json_response)resp_body_json(simplifyVector = TRUE) 参数会将JSON响应解析为R中的列表或数据框,并且尝试将嵌套的JSON对象简化为向量,这对于后续的数据提取非常方便。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
检查json_response的结构,你会发现其中包含了各种数据字段。通常,文件下载链接会以一个特定的键值对形式存在。在本例中,CSV文件的相对路径存储在csv_summary字段中。
# 提取CSV文件的相对路径 csv_relative_path <- json_response$csv_summary # 打印相对路径 print(csv_relative_path)
由于csv_relative_path通常是一个相对路径,我们需要将其与基础URL拼接起来,形成一个完整的下载链接。
# 构建完整的CSV下载链接
full_csv_link <- str_c("https://services.healthtech.dtu.dk", csv_relative_path)
# 打印完整的下载链接
print(full_csv_link)现在,full_csv_link变量中存储的就是我们希望获取的CSV文件下载地址,而无需通过任何UI交互。
一旦获取了完整的下载链接,你就可以使用R的download.file()函数来程序化地下载文件。这在自动化数据收集流程中非常有用。
# 定义文件保存路径和名称
dest_file_name <- "health_summary.csv"
# 下载文件
download.file(url = full_csv_link,
destfile = dest_file_name,
mode = "wb") # "wb" 模式适用于二进制文件,如CSV
message(paste("文件已下载到:", dest_file_name))通过直接与Web应用程序的JSON API交互,我们可以高效、稳定地获取所需的数据和文件下载链接,避免了复杂的UI自动化操作。这种方法不仅提高了数据抓取的效率,也使得代码更加健壮和易于维护。在进行任何数据抓取活动时,请务必遵守网站的服务条款和robots.txt协议。
以上就是通过API/JSON源高效获取网页数据与下载链接的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号