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

问题描述 投票:0回答:2

我正在尝试从以下网站抓取立法者表格: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 包。我收到这个警告:

“install.packages 中的警告: 包‘splashr’不适用于此版本的 R"

查看其他 Stackoverload 问题,一些人建议下载名为 Docker 的东西(例如,How to set up rselenium for R?)。但看起来这将涉及启动 Docker 并在每次我需要抓取某些东西时执行几个复杂的步骤。通过所有这些步骤来抓取单个表是没有意义的。如果没有必要,我也不会下载软件。抓取这张表的最简单方法是什么?我错过了一些我应该做的明显的事情吗?

供参考:我在 macOS Ventura 上使用 Chrome 版本 109.0.5414.119,R 版本 4.2.0.

r web-scraping rvest rselenium
2个回答
1
投票

从网络部分嗅探他们的 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>

0
投票

原来我根本不需要抓取这个页面,因为数据在网络部分以 JSON 形式提供。但是,我能够找到解决 RSelenium 服务器状态错误的方法。我只需要将 Chrome 版本设置为 NULL。


    driver <- rsDriver(browser = "firefox",
                           chromever=NULL,
                           verbose = FALSE)

© www.soinside.com 2019 - 2024. All rights reserved.