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

如何基于lapply遍历的元素为数据框添加行?RSelenium爬虫求助

解决LinkedIn公司描述批量提取并保存为表格的问题

问题分析

原代码存在几个关键问题:

  • 每次遍历链接都重复执行浏览器打开和登录操作,效率极低且易触发LinkedIn反爬机制
  • links采用嵌套列表结构,lapply会把整个向量作为单个参数传入,无法逐个处理链接
  • 依赖固定动态ID(如ember52)定位元素,LinkedIn的动态ID随页面加载变化,定位不稳定
  • 未处理异常场景(如无"显示更多"按钮),会直接导致脚本中断
  • 最终结果未整理为表格格式,无法直接使用

修改后的完整代码

# 加载所需包
library(tidyverse)
library(RSelenium)
library(netstat)

# 初始化浏览器驱动(仅执行一次)
rs_driver_object <- rsDriver(browser = "chrome", chromever = "104.0.5112.79", verbose = FALSE, port = free_port())
RemDr <- rs_driver_object$client

# 登录LinkedIn(仅执行一次)
RemDr$navigate("https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin")
username <- RemDr$findElement(using = "id", value = "username")
username$sendKeysToElement(list("XXX@XXXX.COM"))
password <- RemDr$findElement(using = "id", value = "password")
password$sendKeysToElement(list("XXXXPASS", key = "enter"))

# 定义要处理的链接(改为直接向量,避免嵌套)
links <- c(
  "https://in.linkedin.com/company/almacenes-exito-s-a-",
  "https://in.linkedin.com/company/acerias-de-colombia---acesco",
  "https://www.linkedin.com/company/amt-consultores-legales",
  "https://www.linkedin.com/company/constructora-amarilo-sa"
)

# 定义单个链接的处理函数
scrape_company_desc <- function(link) {
  # 导航到公司页面
  RemDr$navigate(link)
  # 等待页面加载(根据网络情况调整时长)
  Sys.sleep(2)
  
  # 尝试点击"显示更多"按钮,处理按钮不存在的情况
  tryCatch({
    show_more_btn <- RemDr$findElement(using = "css selector", value = "button[data-test-id='about-us-show-more']")
    show_more_btn$clickElement()
    Sys.sleep(1)
  }, error = function(e) {
    message(paste("链接", link, "无显示更多按钮,跳过点击"))
  })
  
  # 提取公司描述(用稳定的测试ID选择器,替代动态ID)
  desc_element <- RemDr$findElement(using = "css selector", value = "div[data-test-id='about-us-description']")
  desc_text <- desc_element$getElementText()[[1]]
  
  # 返回包含链接和描述的列表,方便后续转表格
  list(company_link = link, description = desc_text)
}

# 批量处理所有链接
scraped_results <- lapply(links, scrape_company_desc)

# 转换为数据框(表格格式)
results_df <- bind_rows(scraped_results)

# 查看结果
print(results_df)

# 可选:保存结果到本地CSV文件
write.csv(results_df, "linkedin_company_descriptions.csv", row.names = FALSE)

# 关闭浏览器和驱动,释放资源
RemDr$close()
rs_driver_object$server$stop()

关键修改说明

  • 优化登录逻辑:将浏览器初始化和登录操作移到循环外,仅执行一次,大幅提升效率并降低反爬风险
  • 调整链接结构:把嵌套的list(c(...))改为直接字符向量,确保lapply逐个处理每个链接
  • 稳定元素定位:采用data-test-id属性的CSS选择器替代动态ID,LinkedIn的测试ID相对固定,不会随页面加载变化
  • 异常处理:用tryCatch包裹"显示更多"按钮的点击操作,避免因按钮不存在导致脚本中断
  • 结果格式化:每个函数返回包含链接和描述的列表,最后用bind_rows转换为数据框,方便后续分析和保存
  • 增加等待机制:添加Sys.sleep确保页面元素加载完成,避免因元素未渲染导致的定位失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:06:24