使用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
相关产品推荐
相关产品推荐

