通过API/JSON源高效获取网页数据与下载链接

花韻仙語
发布: 2025-11-09 10:43:22
原创
301人浏览过

通过API/JSON源高效获取网页数据与下载链接

本教程旨在指导如何在不进行ui交互(如右键点击)的情况下,通过直接访问和解析web应用程序的底层json api,程序化地获取特定文件(如csv)的下载链接。该方法比传统的浏览器自动化(如rselenium)更为高效和稳定,适用于需要批量获取数据或避免直接触发文件下载的场景,并演示了如何使用r语言中的`httr2`和`tidyverse`包实现这一过程。

在进行网页数据抓取时,我们经常遇到需要获取文件下载链接但又不希望直接点击下载的情况。例如,某个链接点击后会立即触发文件下载,而不是跳转到可复制链接的页面。在这种场景下,传统的浏览器自动化工具(如RSelenium模拟右键操作)虽然可行,但往往效率较低且稳定性受限于页面渲染。更高效、更健壮的方法是直接与Web应用程序的后端API进行交互,通常这些API以JSON格式提供数据。

理解Web应用程序的数据来源

许多现代Web应用程序采用前后端分离的架构。这意味着网页上显示的数据通常不是直接嵌入在HTML中,而是通过JavaScript异步请求后端API获取的JSON数据动态渲染出来的。如果能直接访问这些JSON API,我们就可以绕过复杂的UI交互,直接获取所需的数据和链接。

对于本教程中的特定案例,目标是获取一个“CSV Summary”文件的下载链接。通过观察或利用浏览器开发者工具(Network tab),可以发现页面上的数据和链接可能来源于一个特定的JSON端点。

1. 识别并访问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对象简化为向量,这对于后续的数据提取非常方便。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

2. 从JSON数据中提取目标链接

检查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交互。

3. 程序化下载文件(可选)

一旦获取了完整的下载链接,你就可以使用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))
登录后复制

注意事项与最佳实践

  1. API稳定性: 直接依赖API接口意味着如果API结构发生变化,你的代码可能需要更新。因此,定期检查API响应结构是一个好习惯。
  2. 请求频率与限制: 许多API有请求频率限制。请遵守网站的使用条款,避免发送过多请求导致IP被封禁。
  3. 身份验证: 某些API可能需要身份验证(如API Key、OAuth token)。在这种情况下,你需要在req_headers()或req_auth()中添加相应的认证信息。
  4. 错误处理: 在实际应用中,应添加错误处理机制,例如检查HTTP响应状态码(resp_status())以确保请求成功,或者处理JSON解析失败的情况。
  5. 替代方案: 如果无法找到公开的JSON API,或者API需要复杂的认证,那么使用rvest进行HTML解析(如果链接在HTML中)或RSelenium进行浏览器自动化仍然是可行的方案。但对于数据提取,API通常是首选。

总结

通过直接与Web应用程序的JSON API交互,我们可以高效、稳定地获取所需的数据和文件下载链接,避免了复杂的UI自动化操作。这种方法不仅提高了数据抓取的效率,也使得代码更加健壮和易于维护。在进行任何数据抓取活动时,请务必遵守网站的服务条款和robots.txt协议。

以上就是通过API/JSON源高效获取网页数据与下载链接的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源: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号