使用R语言爬取BSE印度公告页指定条件的PDF链接
爬取BSEIndia公告页面的PDF链接(R语言实现)
这个网站的公告数据是动态加载的,直接用rvest抓取静态HTML拿不到选择日期和分类后的结果,可通过以下两种方案解决:
方案1:用RSelenium模拟浏览器操作(直观易上手)
适合新手,完全模拟人工操作浏览器的流程:
- 安装并加载所需包
install.packages(c("RSelenium", "rvest", "dplyr")) library(RSelenium) library(rvest) library(dplyr)
- 启动Chrome驱动(需确保Chrome浏览器和chromedriver版本匹配,chromedriver可从Chrome官方渠道下载)
# 启动驱动,端口可自行调整 driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 打开目标页面 remDr$navigate("https://www.bseindia.com/corporates/ann.html")
- 选择分类和日期
# 定位分类下拉框,选择"Results"(可根据页面实际选项文本调整) category_dropdown <- remDr$findElement(using = "id", value = "ddlCategory") category_dropdown$sendKeysToElement(list("Results")) # 输入起始和结束日期(格式DD-MM-YYYY) start_date <- remDr$findElement(using = "id", value = "txtFromDate") start_date$clearElement() start_date$sendKeysToElement(list("01-10-2024")) # 替换成你需要的日期 end_date <- remDr$findElement(using = "id", value = "txtToDate") end_date$clearElement() end_date$sendKeysToElement(list("01-10-2024"))
- 触发搜索并提取PDF链接
# 点击搜索按钮 search_btn <- remDr$findElement(using = "id", value = "btnSubmit") search_btn$clickElement() # 等待页面加载(根据网络情况调整等待时间) Sys.sleep(5) # 获取页面源码并解析 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 提取PDF链接(检查页面元素确认class,这里假设是"pdflink") pdf_links <- page %>% html_elements("a.pdflink") %>% html_attr("href") %>% paste0("https://www.bseindia.com", .) # 补全完整URL # 查看结果 print(pdf_links)
- 关闭浏览器驱动
remDr$close() driver$server$stop()
方案2:直接调用API接口(高效无浏览器)
通过浏览器开发者工具抓包找到网站的实际数据接口,直接发送请求获取数据,速度更快:
- 安装并加载包
install.packages(c("httr", "jsonlite", "dplyr")) library(httr) library(jsonlite) library(dplyr)
- 构造请求并获取数据
# 构造请求参数,根据实际需求调整日期和分类 payload <- list( strCat = "Results", strPrevDate = "01-10-2024", strScrip = "", strSearch = "", strToDate = "01-10-2024", strType = "C" ) # 发送POST请求,需添加请求头模拟浏览器 response <- POST( url = "https://api.bseindia.com/BseIndiaAPI/api/AnnGetData/w", body = payload, encode = "json", add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", "Referer" = "https://www.bseindia.com/corporates/ann.html" ) ) # 解析JSON响应 result <- fromJSON(content(response, "text")) # 提取PDF链接 pdf_links <- result$result$Table %>% filter(!is.na(PDF_LINK)) %>% pull(PDF_LINK) %>% paste0("https://www.bseindia.com", .) # 查看结果 print(pdf_links)
注意事项
- RSelenium方案需匹配浏览器和驱动版本,否则会启动失败;
- API接口的参数或地址可能随网站更新变化,需用浏览器开发者工具抓包确认最新信息;
- 不要频繁发送请求,避免触发网站反爬机制。
内容的提问来源于stack exchange,提问作者user19723933
相关产品推荐
相关产品推荐

