
本文介绍如何通过逆向分析网页api接口,使用r直接调用真实数据服务端点,批量获取马来西亚环境局(doe)apims系统中按日期、站点类型(固定/移动)组织的24小时空气质量监测数据,避免传统dom抓取失效问题。
本文介绍如何通过逆向分析网页api接口,使用r直接调用真实数据服务端点,批量获取马来西亚环境局(doe)apims系统中按日期、站点类型(固定/移动)组织的24小时空气质量监测数据,避免传统dom抓取失效问题。
在Web数据采集实践中,遇到含JavaScript动态下拉菜单(如日期、时间、州属选择器)的页面时,初学者常误入歧途:试图用rvest解析渲染后的DOM结构。但需明确一个关键事实——read_html()仅获取原始HTML源码,无法执行JavaScript。访问 https://www.php.cn/link/bd9fd72b312a8c3da9909464bcccb918 的源码(浏览器中按 Ctrl+U 或 view-source: 前缀)即可发现:表格内容为空,所有数据均由前端JS异步加载。
真正的数据来源藏于网络请求中。通过浏览器开发者工具(F12 → Network → XHR),切换下拉选项可观察到两类规律性请求:
- 固定站数据:
https://apims.doe.gov.my/data/public_v2/CAQM/hours24/{YYYY/MM/DD}/0000.json - 移动站数据:
https://apims.doe.gov.my/data/public_v2/MCAQM/mcaqmhours24/{YYYY/MM/DD}/0000.json
每个JSON响应为矩阵格式:首行为列名(State, Location, 1:00AM, ..., 12:00AM),后续行为数据行。因此,高效方案是跳过前端交互,直连API。
以下为完整可运行代码(需安装 jsonlite, dplyr, tidyr, purrr, stringr, slowly):
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
library(jsonlite)
library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
library(slowly) # install.packages("slowly")
# API URL模板(注意路径中的station_type_endpoint和日期格式)
apims_tmpl 1) {
colnames(json_data) %
strftime("%Y/%m/%d")
# 生成全量请求参数网格
apims_df %
# 拼接URL并并发请求(自动限速)
mutate(
url = str_glue(apims_tmpl),
response = map(url, slowly_get_apims, .progress = TRUE)
) %>%
# 展开嵌套tibble
unnest(response)
# 查看结果结构
glimpse(apims_df)
# 输出示例列:meas_date, station_type_endpoint, State, Location, `1:00AM`, ..., `12:00AM`
关键注意事项:
- ✅ 勿尝试模拟下拉提交:该页面无表单POST,纯前端JS调用API;
- ⚠️ 数据时效性:API仅提供最近若干天数据(非全历史),需根据实际需求调整日期范围;
- ⚠️ 字段含义:
State与Location为地理信息;各小时列(如1:00AM)值含星号(如52**),代表AQI数值及质量等级标识,解析时可用str_remove("\*\*$")清洗; - ? 跨域与反爬:当前API无严格限制,但建议添加
Sys.sleep(1)或使用slowly包控制频率,尊重服务器资源; - ? 扩展性提示:若需特定州属或时段,可在
expand_grid后filter()预筛选,而非请求全部再过滤。
此方法将抓取效率提升一个数量级——从“解析HTML→触发JS→等待渲染→提取表格”的复杂链路,简化为“构造URL→GET JSON→结构化解析”的确定性流程,是现代Web数据采集的推荐范式。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










