从Avanza网站网页抓取股票名称失败的技术求助
问题原因
Avanza的股票列表页面是Angular构建的单页应用,页面内容靠JavaScript动态渲染。read_html()只能抓取页面的静态初始代码,拿不到JS加载后的股票数据,所以你之前不管怎么定位span标签,要么报错要么返回空列表。
解决方案
方法1:直接调用后端API(推荐)
打开浏览器开发者工具的「网络」面板,能找到页面获取股票数据的API接口,直接请求这个接口就能拿到结构化数据,比模拟浏览器高效得多。
示例代码:
library(httr) library(jsonlite) # 对应原页面参数的API地址 api_url <- "https://www.avanza.se/_api/search/stock?sortField=numberOfOwners&sortOrder=DESC&limit=1000§orIds=17&countryCodes=SE" # 发送请求并解析JSON数据 response <- GET(api_url) data <- fromJSON(content(response, "text")) # 提取股票名称 stock_names <- data$hits$name # 查看前几个结果 head(stock_names)
用这个方法不仅能拿到名称,还能获取股票代码、市值等其他字段,实用性更强。
方法2:用RSelenium模拟浏览器加载内容
如果不想找API,就用RSelenium启动真实浏览器,等页面完全渲染后再抓取内容。
示例代码:
library(RSelenium) library(rvest) # 启动Chrome浏览器(需提前安装Chrome和对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 打开目标页面 remDr$navigate("https://www.avanza.se/aktier/hitta.html?sectorId=17&s=numberOfOwners.desc&o=1000§orName=Bioteknik%20%26%20L%C3%A4kemedel&cc=SE") # 等待页面加载完成(可根据网络情况调整等待时间) Sys.sleep(5) # 获取渲染后的页面HTML并解析 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 定位股票名称节点(渲染后的页面里,名称通常在class为'ellipsis'的span中) stock_names <- page %>% html_nodes("span.ellipsis") %>% html_text() # 关闭浏览器和驱动 remDr$close() driver$server$stop() # 查看结果 head(stock_names)
注意:使用前要确保ChromeDriver版本和你的Chrome浏览器版本匹配,不然会启动失败。
内容的提问来源于stack exchange,提问作者HelloSanta
相关产品推荐
相关产品推荐

