我正在尝试从以下网站抓取立法者表格: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.
从网络部分嗅探他们的 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>
原来我根本不需要抓取这个页面,因为数据在网络部分以 JSON 形式提供。但是,我能够找到解决 RSelenium 服务器状态错误的方法。我只需要将 Chrome 版本设置为 NULL。
driver <- rsDriver(browser = "firefox",
chromever=NULL,
verbose = FALSE)