You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R语言RSelenium包爬取含4个联动下拉菜单网页数据的方法咨询

RSelenium 爬取四级联动下拉菜单对应表格完整方案

需求说明

需要爬取网页 https://hindi.iocl.com/lpgdistributors.aspx 的LPG经销商数据,该页面设置4个联动下拉菜单,选中每级菜单选项提交后会展示对应匹配的经销商表格,需要遍历所有下拉选项组合,合并所有返回表格得到完整汇总表。

现有代码问题

  • 四级下拉为联动逻辑,必须先选中上一级选项后,下一级的可选值才会动态加载,无法一次性提前提取所有下拉的选项值
  • 缺少嵌套循环遍历所有选项组合的逻辑,也没有表格合并和异常处理逻辑

修正后完整代码

library(RSelenium)
library(rvest)
library(stringr)

# 关闭残留java进程
system("taskkill /im java.exe /f", intern=FALSE, ignore.stdout=FALSE)

# 启动浏览器
rD <- rsDriver(browser = c("firefox")) 
remDr <- rD$client
remDr$navigate("https://hindi.iocl.com/lpgdistributors.aspx") 

# 自定义函数:获取指定下拉菜单的所有有效选项值
get_dropdown_options <- function(remDr, dropdown_id) {
  Sys.sleep(1) # 等待下拉菜单加载完成
  dropdown <- remDr$findElement(using = 'id', value = dropdown_id)
  options <- dropdown$findChildElements(using = 'tag name', value = 'option')
  # 提取所有非空value,排除默认的"请选择"类空选项
  option_values <- sapply(options, function(x) x$getElementAttribute('value')[[1]])
  option_values <- option_values[option_values != ""]
  return(option_values)
}

# 初始化总汇总表
total_df <- data.frame()

# 第一层循环:遍历所有州选项
state_values <- get_dropdown_options(remDr, "cmbState")
for (s_val in state_values) {
  # 选中当前州
  state_opt <- remDr$findElement(using = 'xpath', paste0("//select[@id='cmbState']/option[@value='", s_val, "']"))
  state_opt$clickElement()
  Sys.sleep(1.5) # 等待下一级(地区)下拉加载完成
  
  # 获取当前州下所有地区选项
  district_values <- get_dropdown_options(remDr, "cmbDistrict")
  if (length(district_values) == 0) next
  # 第二层循环:遍历当前州下所有地区
  for (d_val in district_values) {
    district_opt <- remDr$findElement(using = 'xpath', paste0("//select[@id='cmbDistrict']/option[@value='", d_val, "']"))
    district_opt$clickElement()
    Sys.sleep(1.5) # 等待下一级(市场)下拉加载完成
    
    # 获取当前地区下所有市场选项
    market_values <- get_dropdown_options(remDr, "cmbMarket")
    if (length(market_values) == 0) next
    # 第三层循环:遍历当前地区下所有市场
    for (m_val in market_values) {
      market_opt <- remDr$findElement(using = 'xpath', paste0("//select[@id='cmbMarket']/option[@value='", m_val, "']"))
      market_opt$clickElement()
      Sys.sleep(1.5) # 等待下一级(区域)下拉加载完成
      
      # 获取当前市场下所有区域选项
      area_values <- get_dropdown_options(remDr, "cmbArea")
      if (length(area_values) == 0) next
      # 第四层循环:遍历当前市场下所有区域
      for (a_val in area_values) {
        area_opt <- remDr$findElement(using = 'xpath', paste0("//select[@id='cmbArea']/option[@value='", a_val, "']"))
        area_opt$clickElement()
        Sys.sleep(0.5)
        
        # 点击搜索提交
        submit_btn <- remDr$findElement(using = 'id', value = 'btnSearch')
        submit_btn$clickElement()
        Sys.sleep(2) # 等待表格加载完成
        
        # 异常捕获:避免无数据时中断爬取
        tryCatch({
          table_ele <- remDr$findElement(using = 'id', value = 'grdDistributors')
          current_df <- table_ele$getPageSource()[[1]] %>% 
            read_html() %>% 
            html_table(fill = TRUE) %>% 
            .[[1]]
          # 追加当前选择的四级选项值到表格,方便后续溯源
          current_df$state_value <- s_val
          current_df$district_value <- d_val
          current_df$market_value <- m_val
          current_df$area_value <- a_val
          # 合并到总汇总表
          total_df <- rbind(total_df, current_df)
        }, error = function(e) {
          message(paste("选项组合", s_val, d_val, m_val, a_val, "无匹配数据,已跳过"))
        })
      }
    }
  }
}

# 导出完整汇总表到本地
write.csv(total_df, "IOCL_LPG经销商完整数据.csv", row.names = FALSE, fileEncoding = "UTF-8")

# 关闭驱动和浏览器
remDr$close()
rD$server$stop()

注意事项

  • 运行前请确保已配置好对应浏览器的驱动,火狐浏览器需安装geckodriver,Chrome浏览器需安装chromedriver,且驱动路径已加入系统环境变量
  • 可根据自身网络情况调整代码中Sys.sleep()的等待时长,避免页面未加载完成就执行下一步导致报错
  • 若爬取过程中触发网站反爬限制,可适当调大等待时长,或在循环中加入随机等待逻辑

内容的提问来源于stack exchange,提问作者Roy A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:09:03