抓取R中动态生成的网页,无需下载Docker

ndh0cuux  于 2023-02-10  发布在  Docker
关注(0)|答案(1)|浏览(206)

我试着从以下网站上拼凑出一张立法者的表格:https://www.legis.ga.gov/members/house
首先,我尝试了Rvest,但没有工作,因为页面是动态生成的。

library(rvest)
url <- 'https://www.legis.ga.gov/members/house'
page = read_html(url)
page %>% 
  html_element("table") %>%
  html_table()

#Error in View : no applicable method for 'html_table' applied to an object of class "xml_missing"

然后我试了rselenium。那不起作用,因为它不能确定服务器状态。

library(RSelenium)
rD = rsDriver(browser="chrome", port=4234L, chromever="109.0.5414.74")

#Warning message:
#In rsDriver(browser = "chrome", port = 4234L, chromever = "109.0.5414.74") :
#  Could not determine server status.

library(wdman)
selServ <- wdman::selenium(verbose = FALSE)
selServ$log()

#$stderr
#[1] ""
#
#$stdout
#[1] ""

然后我试着安装Splash包,我得到了这个警告:
"安装包中的警告:包'splashr'不适用于此版本的R "
看看其他的Stackoverload问题,一些人建议下载一个叫做Docker的东西(例如,How to set up rselenium for R?)。但是看起来每次我需要抓取一些东西时,这都需要启动Docker并执行几个复杂的步骤。为了抓取一个表而执行所有这些步骤是没有意义的。如果没有必要,我也会怀疑下载软件。刮这张table最简单的方法是什么?我是不是漏掉了一些我应该做的明显的事情?
供参考:我在macOS Ventura,R版本4.2.0上使用的是Chrome版本109.0.5414.119。

enyaitl3

enyaitl31#

从网络部分嗅探他们的API并使用httr2调用它

library(httr2)
library(tidyverse)

"https://www.legis.ga.gov/api/members/list/1031?chamber=1" %>% 
  request() %>%
  req_auth_bearer_token("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE2NzU3OTY4NDgsImV4cCI6MTY3NTc5NzE0OCwiaWF0IjoxNjc1Nzk2ODQ4fQ.3pxxIurHe8uPgXGY0DZay0wAUk8Lf5rbHsGvXiNbYMY") %>% 
  req_perform() %>% 
  resp_body_json(simplifyVector = TRUE) %>% 
  as_tibble() 

# A tibble: 178 × 13
   district$id party photos lastName  districtNumber city     fullName sessionId    id name$first
         <int> <int> <list> <chr>              <int> <chr>    <chr>        <int> <int> <chr>     
 1          59     0 <df>   Adesanya              43 Marietta Solomon…      1031  5025 Solomon   
 2         158     0 <df>   Adeyina              110 Grayson  Segun A…      1031  5044 Segun     
 3          99     0 <df>   Alexander             66 Hiram    Kimberl…      1031   806 Kimberly  
 4          12     1 <df>   Anderson              10 Cornelia Victor …      1031  4989 Victor    
 5          54     0 <df>   Anulewicz             42 Smyrna   Teri An…      1031  4915 Teri      
 6          72     0 <df>   Au                    50 Johns C… Michell…      1031  4983 Michelle  
 7         203     1 <df>   Ballard              147 Warner … Bethany…      1031  5051 Bethany   
 8          29     1 <df>   Ballinger             23 Canton   Mandi B…      1031   808 Mandi     
 9         132     0 <df>   Barnes                86 Tucker   Imani B…      1031  5037 Imani     
10          30     1 <df>   Barrett               24 Cumming  Carter …      1031  5020 Carter    
# … with 168 more rows, and 11 more variables: district$number <int>, $chamberType <int>,
#   $suffix <chr>, name$last <chr>, $middle <chr>, $nickname <chr>, $suffix <chr>,
#   $familyName <chr>, districtAddress <df[,8]>, residence <chr>, dateVacated <lgl>

相关问题