You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页爬取合法性疑问及R rvest爬取MarineTraffic数据失败求助

网页爬取疑问解答

1. 网站爬取的合法性判断

  • 不能合法爬取任意网站,判断依据主要有两个方向:
    • 网站服务条款:绝大多数网站的服务条款会明确规定是否允许爬虫行为,比如禁止未经授权批量爬取、限制请求频率等,这是最直接的合规依据。
    • robots.txt 文件:访问网站根目录下的 robots.txt(例如 https://目标域名/robots.txt),文件里会明确标注哪些路径允许爬虫访问、哪些禁止。这属于网站的指引性规则,虽非法律强制,但违反可能触发反爬机制,也可能违反服务条款。
  • 额外注意:即便网站未禁止爬取,若爬取内容涉及版权、个人隐私信息,仍可能触犯法律。

2. 爬取MarineTraffic船舶Latest Position失败的解决方法

你得到 character(0) 的结果,核心原因是该页面的Latest Position数据是JavaScript动态渲染的,read_html 只能获取静态HTML源码,无法拿到JS加载后的内容。可以用以下两种方案解决:

方案1:用RSelenium模拟浏览器加载

通过模拟真实浏览器运行JS,获取完整渲染后的页面内容:

library(RSelenium)
library(rvest)

# 启动Chrome浏览器驱动(需提前配置好ChromeDriver环境)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate("https://www.marinetraffic.com/en/ais/details/ships/shipid:1914339/")

# 等待页面加载完成(可根据网络情况调整等待时长)
Sys.sleep(3)

# 获取渲染后的页面源码
page_source <- remDr$getPageSource()[[1]]
simple <- read_html(page_source)

# 提取Latest Position内容(注意:网站样式类可能会更新,需重新确认选择器)
latest_position <- simple %>% html_nodes(".MuiTypography-root.MuiTypography-body1.css-18xv3ee") %>% html_text()
print(latest_position)

# 关闭浏览器和驱动
remDr$close()
driver$server$stop()

方案2:直接调用网站API接口

MarineTraffic的动态数据通常通过API接口返回,效率比模拟浏览器更高:

  1. 打开浏览器开发者工具(按F12),切换到「网络」标签;
  2. 刷新目标页面,筛选「XHR/fetch」类型请求,找到返回船舶位置数据的API接口;
  3. 用httr包直接请求该接口获取数据:
library(httr)
library(jsonlite)

# 示例接口(需实际抓包确认真实接口地址)
response <- GET("https://www.marinetraffic.com/api/ships/1914339/position")
data <- fromJSON(content(response, "text"))
print(data$latest_position)

注意:调用API前务必确认网站服务条款,确保允许此类请求,避免违规。

内容的提问来源于stack exchange,提问作者Paddy Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:54:28