R语言使用rvest包read_html无法获取NSE股票网站HTML如何解决?
问题原因
NSE(印度国家证券交易所)网站配置了基础反爬校验规则,会检查HTTP请求的请求头信息,你直接使用read_html()发送无请求头的裸请求,会被服务器拦截,请求长期处于等待响应状态,因此控制台没有返回内容也不报错。
解决方案
使用httr包构造符合浏览器规范的HTTP请求,携带合法请求头模拟普通用户访问,即可正常拿到页面内容。
如果未安装httr包,先执行安装命令:install.packages("httr")
修改后的可运行代码如下:
library(rvest) library(dplyr) library(httr) nes_link <- "https://www.nseindia.com/get-quotes/equity?symbol=TATAMOTORS" # 构造带请求头的GET请求,模拟浏览器访问,设置超时避免长期卡住 response <- GET( url = nes_link, add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", `Accept-Language` = "en-US,en;q=0.9" ), timeout(10) ) # 校验请求状态后提取数据 if (status_code(response) == 200) { nes_page <- read_html(content(response, "text")) price_day1 <- nes_page %>% html_nodes("span#quoteLtp") %>% html_text() print(price_day1) } else { print(paste("请求失败,状态码:", status_code(response))) }
注意事项
- 不要短时间内频繁向该网站发送请求,避免IP被临时封禁
- 如果运行后返回值为空,说明目标数据是前端JS动态渲染生成的,静态爬取无法获取,可以改用RSelenium等无头浏览器工具,模拟浏览器完整加载页面后再提取数据
内容的提问来源于stack exchange,提问作者Shaikh Faizan Ahmed
相关产品推荐
相关产品推荐

