如何基于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
相关产品推荐
相关产品推荐

