使用Rvest和Selenium提取LinkedIn中<span>内指定文本遇阻
解决LinkedIn经验板块职位名称爬取问题
问题分析
你的第二次代码返回空对象,核心原因是LinkedIn的经验板块内容依赖JavaScript动态渲染:直接用read_html()获取的静态HTML里,#experience节点下并没有实际的职位数据,自然提取不到内容。另外,逐层使用html_nodes()的写法也可以简化为复合CSS选择器,但前提是页面内容已完整加载。
解决方案
方法1:处理动态加载内容(推荐)
使用RSelenium模拟浏览器加载页面,获取完整渲染后的源码再解析:
library(RSelenium) library(rvest) # 启动Chrome浏览器驱动(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标主页 remDr$navigate("https://www.linkedin.com/in/hadleywickham/") # 滚动到经验板块并等待加载 remDr$executeScript("window.scrollTo(0, document.getElementById('experience').offsetTop);") Sys.sleep(2) # 等待内容加载完成 # 获取渲染后的页面源码 page_source <- remDr$getPageSource()[[1]] signals <- read_html(page_source) # 提取经验板块下的所有职位名称 roles <- signals %>% html_nodes("#experience .pvs-list__item--line-separated .visually-hidden") %>% html_text() # 清理资源 remDr$close() driver$server$stop()
方法2:优化静态页面选择器(仅当静态页面包含数据时有效)
如果目标页面的经验板块在静态HTML中已存在,可以简化CSS选择器,避免逐层筛选的冗余:
roles <- signals %>% html_nodes("#experience span.visually-hidden") %>% html_text()
注意事项
- LinkedIn有反爬机制,频繁爬取可能触发IP封禁,建议控制请求频率,必要时模拟登录账号。
- 页面CSS类名可能会随LinkedIn更新变化,若提取失效,需重新查看页面结构调整选择器。
内容的提问来源于stack exchange,提问作者Anis Boughanmi
相关产品推荐
相关产品推荐

