RStudio中抓取无指定URL的央行贸易进出口数据的技术问题
解决RStudio中抓取需手动筛选的动态贸易数据问题
我经常帮人处理这类动态数据抓取的需求,给你一套实用的解决思路,亲测有效:
第一步:拆解页面的动态请求逻辑
当你在网页上手动选择年份、月份等筛选条件并提交时,浏览器其实是在后台向服务器发送了特定请求(大多是POST请求)。你需要用浏览器开发者工具捕获这个关键请求:
- 打开目标网站,按F12调出开发者工具,切换到「网络」标签页
- 清空现有请求记录,然后手动完成一次筛选+查询操作
- 在请求列表里找带
api/data/query关键词的请求,或者方法为POST的请求,这就是获取数据的核心接口 - 查看这个请求的表单参数(Form Data里的键值对,对应你选的筛选条件)、请求头,以及返回的响应格式(JSON/CSV/Excel等)
第二步:在R中模拟发送请求
拿到请求细节后,就可以用R的工具包模拟这个请求,直接获取数据:
- 如果返回JSON格式,用
httr+jsonlite组合:library(httr) library(jsonlite) # 构造筛选参数,对应你捕获到的Form Data内容 request_params <- list( year = "2024", month = "05", trade_type = "import", # 对应进口/出口的筛选值 sector = "all" ) # 替换成你捕获到的真实API地址 response <- POST(url = "http://www.bcr.gob.sv/trade-api-endpoint", body = request_params, encode = "form") # 解析响应为数据框 trade_data <- fromJSON(content(response, "text")) - 如果返回CSV/Excel文件,直接保存响应内容再读取:
# 保存响应为本地文件 writeBin(content(response, "raw"), "salvador_trade_data.csv") # 读取数据 trade_data <- read.csv("salvador_trade_data.csv")
第三步:处理会话验证或反爬限制
有些网站会验证用户会话(比如Cookie),这时候需要把浏览器捕获到的Cookie加入请求头:
# 从开发者工具中复制Cookie内容,替换成实际值 custom_headers <- add_headers(Cookie = "session_id=xxx; user_token=yyy") response <- POST(url = "目标API地址", body = request_params, encode = "form", headers = custom_headers)
第四步:应对纯JavaScript渲染的页面
如果网站是用React/Vue等框架动态渲染数据,没有直接的API接口,就用RSelenium模拟真实浏览器操作:
library(RSelenium) library(rvest) # 启动Chrome浏览器(需提前配置Selenium环境,或用Docker简化) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 打开目标数据页面 remDr$navigate("http://www.bcr.gob.sv/你的目标页面路径") # 模拟选择年份:点击下拉框并输入2024 year_dropdown <- remDr$findElement(using = "css", value = "#year-select") year_dropdown$sendKeysToElement(list("2024")) # 模拟点击查询按钮 submit_button <- remDr$findElement(using = "css", value = "#submit-btn") submit_button$clickElement() # 等待页面加载完成,抓取表格数据 Sys.sleep(3) # 根据页面加载速度调整等待时间 page_html <- remDr$getPageSource()[[1]] trade_data <- read_html(page_html) %>% html_table(fill = TRUE) # 关闭浏览器会话 remDr$close() driver$server$stop()
重要提醒
- 务必遵守目标网站的
robots.txt规则和使用条款,不要高频发送请求给服务器造成压力 - 如果遇到加密的参数值,需要仔细分析请求中参数和你手动选择值的对应关系
- 部分网站有IP封禁机制,必要时可以添加请求延迟或使用代理
内容的提问来源于stack exchange,提问作者The-Dancing-Machine-Learning
相关产品推荐
相关产品推荐

