如何用RStudio从MarineTraffic抓取指定船舶位置数据?
搞定MarineTraffic船舶位置数据抓取的完整方案
嘿,我来帮你解决这个问题!首先得说清楚:MarineTraffic的页面很多核心数据是动态加载的——也就是你打开页面时,浏览器会先加载静态HTML,再通过JavaScript偷偷从后端接口拉取真实的位置数据。所以你直接用rvest的read_html()抓页面,根本拿不到想要的内容,因为那些数据不在静态HTML里。咱们一步步来搞定:
第一步:装好用得上的R包
你需要三个核心包,先安装(没装过的话):
install.packages(c("rvest", "httr", "jsonlite"))
然后加载到环境里:
library(rvest) library(httr) library(jsonlite)
rvest:辅助解析HTML(这次主要靠后面两个包)httr:模拟浏览器发送HTTP请求,搞定动态接口jsonlite:把接口返回的JSON数据转成R能处理的格式
第二步:找到真实的数据接口
直接抓页面行不通,咱们得找到MarineTraffic藏起来的API接口:
- 打开你给的船舶页面,按下F12打开浏览器开发者工具
- 切换到「网络」标签,刷新页面,然后过滤「XHR」类型的请求
- 找一找带
shipid参数的请求,比如类似/getvesseldata的接口——这就是真正返回位置数据的地方
第三步:写代码直接抓API数据
直接调用API比解析HTML高效多了,还能拿到结构化数据。给你写好示例代码:
# 目标船舶的ID,就是你链接里的199293 ship_id <- 199293 # 构造API请求地址(这个是从开发者工具里扒的,要是以后失效了,再去工具里找新的就行) api_url <- paste0("https://www.marinetraffic.com/en/ais/ajax/getvesseldata/shipid:", ship_id) # 发送请求,得加请求头模拟浏览器,不然容易被网站拦截 response <- GET( url = api_url, add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Referer" = paste0("https://www.marinetraffic.com/en/ais/details/ships/shipid:", ship_id) ) ) # 把返回的JSON转成R数据框/列表 ship_data <- fromJSON(content(response, as = "text")) # 提取你要的位置相关数据,按需调整 location_details <- list( 纬度 = ship_data$LAT, 经度 = ship_data$LON, 当前航速 = ship_data$SPEED, 航向 = ship_data$HEADING, 航行状态 = ship_data$NAVSTAT ) # 看看结果 print(location_details)
为啥你原来的代码没效果?
你之前写的:
"https://www.marinetraffic.com/en/ais/details/ships/shipid:199293" %>% read_html() %>% html_nodes("div#MuiTypography-displayInline")
问题出在:
div#MuiTypography-displayInline对应的内容是JavaScript渲染出来的,静态HTML里根本没有,所以read_html()抓不到- 就算侥幸抓到,解析出来的也是零散文本,远不如API返回的结构化数据好用
最后提个醒
- MarineTraffic的API可能会随时更新,如果上面的URL用不了了,记得再去浏览器开发者工具里找新的接口
- 别疯狂刷请求,容易触发反爬,建议加个间隔比如
Sys.sleep(5)再请求 - 遵守网站的服务条款,别拿来搞商业用途或者大规模抓取哦
内容的提问来源于stack exchange,提问作者greenhorn246
相关产品推荐
相关产品推荐

