使用R语言rvest、xml2包爬取招聘网站数据遇阻求助
问题原因
目标站点的职位列表由JavaScript动态渲染生成,rvest的read_html()仅能获取初始静态HTML源码,该源码不包含渲染完成后的职位节点,因此选择器正确也无法提取到对应数据。
解决方案
以下提供两种可行实现方式:
方案1:请求数据接口(效率更高)
站点的职位数据通过独立接口返回JSON格式内容,无需解析HTML,直接请求接口即可快速获取全量字段。
操作方式:
- 打开浏览器开发者工具(F12),切换至「网络」标签,筛选「Fetch/XHR」分类
- 刷新页面后找到加载职位数据的接口请求,直接构造该请求即可,返回数据用
jsonlite解析后可直接提取所需字段
参考代码:
library(httr) library(jsonlite) library(dplyr) # 构造请求,接口地址可从开发者工具中复制 resp <- GET( "https://gehaltsreporter.de/api/v1/jobs?q=Immobilienkaufmann&page=1", add_headers(`User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") ) job_raw <- fromJSON(content(resp, as = "text")) # 从返回的JSON结构中直接提取职位名称、公司、薪资等所有字段 job_list <- job_raw$data
方案2:模拟浏览器动态渲染
如果接口有反爬限制难以构造,可以使用RSelenium启动真实浏览器,等待页面渲染完成后再提取节点:
参考代码:
library(RSelenium) library(rvest) library(dplyr) # 启动Chrome浏览器,chromever需与本地安装的Chrome版本一致 driver <- rsDriver(browser = "chrome", chromever = "118.0.5993.88") remDr <- driver$client remDr$navigate("https://gehaltsreporter.de/stellenangebote-jobs/?q=Immobilienkaufmann") # 等待页面JS渲染完成 Sys.sleep(3) # 获取渲染后的完整页面源码 page_src <- remDr$getPageSource()[[1]] html <- read_html(page_src) # 用你之前确认的选择器提取数据即可 job_titles <- html %>% html_nodes(".job-title") %>% html_text2() companies <- html %>% html_nodes(".job-company") %>% html_text2() # 操作完成后关闭浏览器进程 remDr$close() driver$server$stop()
注意事项
- 站点存在基础反爬机制,请求间隔建议设置为1秒以上,避免IP被临时封禁
- 所有请求建议添加User-Agent头,模拟正常浏览器访问,降低被拦截概率
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

