如何抓取mtgstocks.com不可抓取页面?获取卡牌名称与系列信息
解决MTGStocks页面爬取无结果的问题
你的问题出在网站内容是JavaScript动态渲染的,直接用httr::GET获取的是未加载动态内容的静态HTML,自然找不到目标元素。下面提供两种可行的解决方案:
方案1:使用RSelenium(模拟真实浏览器)
RSelenium会启动真实浏览器加载页面,等待JS渲染完成后再获取内容,步骤如下:
# 首次运行先安装依赖包 install.packages(c("RSelenium", "rvest")) library(RSelenium) library(rvest) # 启动Chrome会话(需提前安装对应版本的ChromeDriver并配置到系统PATH) driver <- rsDriver(browser = "chrome", chromever = "126.0.6478.126") # 替换为你的Chrome版本 remDr <- driver[["client"]] # 加载目标页面 remDr$navigate("https://www.mtgstocks.com/prints/1") # 等待JS加载完成(根据网络情况调整等待时间) Sys.sleep(3) # 获取渲染后的页面源码 page_source <- remDr$getPageSource()[[1]] page_html <- read_html(page_source) # 提取卡牌名称和系列(CSS选择器需根据页面实际结构调整) card_name <- page_html %>% html_nodes("h3.card-name a") %>% html_text() card_set <- page_html %>% html_nodes("div.set-name") %>% html_text() # 输出结果 cat("卡牌名称:", card_name, "\n") cat("卡牌系列:", card_set, "\n") # 关闭浏览器会话 remDr$close() driver$server$stop()
方案2:使用Chromote(轻量无头浏览器)
Chromote基于Chrome DevTools协议,无需完整浏览器环境,更适合服务器端运行:
# 首次运行安装依赖包 install.packages(c("chromote", "rvest")) library(chromote) library(rvest) # 启动无头Chrome会话 b <- ChromoteSession$new() # 加载页面并等待加载完成 b$Page$navigate("https://www.mtgstocks.com/prints/1") b$Page$loadEventFired(wait_ = TRUE) # 获取渲染后的页面源码 page_source <- b$Runtime$evaluate("document.documentElement.outerHTML")$result$value page_html <- read_html(page_source) # 提取目标信息 card_name <- page_html %>% html_nodes("h3.card-name a") %>% html_text() card_set <- page_html %>% html_nodes("div.set-name") %>% html_text() # 输出结果 cat("卡牌名称:", card_name, "\n") cat("卡牌系列:", card_set, "\n") # 关闭会话 b$close()
注意事项
- 确认CSS选择器:可以通过浏览器F12开发者工具,查看渲染后的元素结构,复制正确的CSS选择器(比如如果页面结构有变动,需对应调整选择器)。
- 遵守网站规则:不要高频次爬取,避免触发反爬机制导致IP被封禁。
内容的提问来源于stack exchange,提问作者Hanna Haddad
相关产品推荐
相关产品推荐

