网页爬取合法性疑问及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接口返回,效率比模拟浏览器更高:
- 打开浏览器开发者工具(按F12),切换到「网络」标签;
- 刷新目标页面,筛选「XHR/fetch」类型请求,找到返回船舶位置数据的API接口;
- 用
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
相关产品推荐
相关产品推荐

