使用R进行Web Scraping:下拉菜单选择问题求助
解决RSelenium无法选中下拉菜单并循环抓取数据的方案
核心问题分析
你的代码仅定位了下拉框和按钮元素,但未实现提取下拉选项、选中指定选项以及遍历所有组合的逻辑,同时缺少Selenium驱动的完整初始化步骤。
完整解决方案代码
library(RSelenium) # 1. 初始化Selenium驱动(以Chrome为例,需确保驱动与浏览器版本匹配) # 若使用最新版Chrome,可省略chromever参数;旧版本需指定对应版本号 rs_driver_object <- rsDriver(browser = "chrome") remDr <- rs_driver_object$client # 2. 目标页面导航 remDr$navigate("http://extranet.artesp.sp.gov.br/TransporteColetivo/OrigemDestino?fbclid=IwAR3_hZwajHk_iyU085S1LDTqLCOYLHIZ5K825XgPGcB4tMI0EuCJpQNrJHM#") # 3. 提取下拉菜单所有有效选项 # 处理Origem下拉框 origem_options <- remDr$findElement(using = 'id', 'Origem')$findChildElements(using = 'tag name', 'option') origem_list <- lapply(origem_options, function(x) { list(text = x$getElementText()[[1]], value = x$getElementAttribute("value")[[1]]) }) # 过滤空值选项(排除默认占位项) origem_list <- Filter(function(item) item$value != "", origem_list) # 处理Destino下拉框 destino_options <- remDr$findElement(using = 'id', 'Destino')$findChildElements(using = 'tag name', 'option') destino_list <- lapply(destino_options, function(x) { list(text = x$getElementText()[[1]], value = x$getElementAttribute("value")[[1]]) }) destino_list <- Filter(function(item) item$value != "", destino_list) # 4. 创建空数据框存储结果 result_df <- data.frame( Origem = character(), Destino = character(), Resultado = character(), stringsAsFactors = FALSE ) # 5. 双重循环遍历所有选项组合 for (origem_item in origem_list) { # 选中当前Origem选项 remDr$findElement(using = 'id', 'Origem')$sendKeysToElement(list(origem_item$value)) # 等待页面响应(若下拉框为联动式,需延长等待时间) Sys.sleep(2) for (destino_item in destino_list) { # 选中当前Destino选项 remDr$findElement(using = 'id', 'Destino')$sendKeysToElement(list(destino_item$value)) Sys.sleep(1) # 点击查询按钮 btn_pesquisar <- remDr$findElement(using = 'id', 'btnPesquisar') btn_pesquisar$clickElement() # 等待结果加载完成(根据页面速度调整时长) Sys.sleep(3) # 抓取查询结果(需根据实际页面HTML结构调整元素定位) resultado_texto <- tryCatch( {remDr$findElement(using = 'css selector', '#resultado-area')$getElementText()[[1]]}, error = function(e) {"无匹配结果"} ) # 将结果存入数据框 result_df <- rbind(result_df, data.frame( Origem = origem_item$text, Destino = destino_item$text, Resultado = resultado_texto, stringsAsFactors = FALSE )) } } # 6. 清理资源 remDr$close() rs_driver_object$server$stop() # 可选:将结果写入本地文件 write.csv(result_df, "origem_destino_resultados.csv", row.names = FALSE)
关键注意事项
- 驱动版本匹配:Chrome驱动需与本地Chrome版本一致,可从对应官方渠道下载匹配版本
- 等待逻辑优化:
Sys.sleep是简单等待方式,更高效的做法是使用remDr$waitForElement等待目标元素加载完成,避免无效等待 - 联动下拉处理:若选择Origem后Destino选项会动态更新,需在每次循环Origem后重新获取Destino的选项列表,而不是提前一次性提取
- 结果定位调整:代码中
#resultado-area是假设的结果容器选择器,需根据实际页面的HTML结构修改为正确的元素定位方式
内容的提问来源于stack exchange,提问作者L3A
相关产品推荐
相关产品推荐

