首次R网页爬取工作项目遇阻:寻求RSelenium替代简便方案
解决Utah法案列表网页爬取问题
问题根源
你判断的没错,这个页面的法案数据是JavaScript动态加载的,read_html()只能获取初始静态HTML,无法拿到JS渲染后的目标内容,所以看不到你需要的元素。
最优简便方案:直接调用后端API
通过检查页面网络请求,发现该页面的法案数据来自一个公开API,直接请求API比浏览器渲染简单高效:
1. 安装并加载必要包
install.packages(c("httr", "jsonlite", "dplyr")) library(httr) library(jsonlite) library(dplyr)
2. 请求API并解析数据
# 调用API获取原始数据 response <- GET("https://le.utah.gov/DynaBill/api/BillList?session=2024GS") bill_raw_data <- fromJSON(content(response, "text"))
3. 提取整理目标字段
API返回的JSON包含所有你需要的信息,直接筛选整理成数据框:
bill_df <- bill_raw_data %>% select( bill_number = billName, short_title = shortTitle, sponsor = sponsorName, last_updated = lastUpdate, link = billLink ) %>% mutate(link = paste0("https://le.utah.gov", link)) # 补全完整URL路径
运行head(bill_df)即可查看提取好的前几条数据,完全匹配你的需求。
备选方案:用polite包模拟浏览器请求(API失效时用)
如果后续API无法访问,可使用polite包模拟浏览器请求头,触发页面JS加载:
install.packages("polite") library(polite) library(rvest) # 创建会话模拟浏览器 session <- bow( url = "https://le.utah.gov/DynaBill/BillList?session=2024GS", user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" ) # 获取渲染后的页面 page <- scrape(session) # 提取各字段 bill_numbers <- page %>% html_elements(".nlink") %>% html_text() bill_links <- page %>% html_elements(".nlink") %>% html_attr("href") %>% paste0("https://le.utah.gov", .) short_titles <- page %>% html_elements(".shortTitle") %>% html_text() sponsors <- page %>% html_elements(".sponsorName") %>% html_text() last_updates <- page %>% html_elements(".lastUpdate") %>% html_text() # 整理成数据框 bill_df_alt <- data.frame( bill_number = bill_numbers, short_title = short_titles, sponsor = sponsors, last_updated = last_updates, link = bill_links )
最后考虑RSelenium(仅当以上方法失效时)
如果页面结构大幅变化,再用RSelenium启动浏览器渲染页面:
install.packages("RSelenium") library(RSelenium) library(rvest) # 启动Chrome驱动(需提前安装ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 打开目标页面并等待加载 remDr$navigate("https://le.utah.gov/DynaBill/BillList?session=2024GS") Sys.sleep(3) # 获取渲染后的页面源码 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 后续提取步骤同备选方案 # 关闭浏览器和驱动 remDr$close() driver$server$stop()
内容的提问来源于stack exchange,提问作者Ncliften
相关产品推荐
相关产品推荐

