如何使用 readLines 和 R 中的循环从多个 (435) 网页获取信息?



我正在尝试从公开机密网页上抓取有关2018年美国国会大选的数据。每个地区都有不同的网址。在单个 URL 上使用 readLines 可以准确地为我提供我正在寻找的输出。这为我提供了亚利桑那州第一选区的正确输出:

dollars <- readLines("https://www.opensecrets.org/races/summary?cycle=2018&id=AZ01&spec=N", encoding ='UTF-8')

但是,我想从所有435个地区获得所有信息。我知道我可以手动创建 URL 向量,但这似乎效率极低。相反,我想遍历共享相同基础的所有 URL。我正在尝试使用此代码:

Parl_all <- list()
for (i in 1:435) {
df <- readLines(paste("https://www.opensecrets.org/races/summary?
cycle=2018&id=",i,"&spec=N", sep=""), encoding = 'UTF-8')
df <- str_replace_all(df, "<img src='images/check.gif'>", "<font 
size='2'>Yes</font>")
df <- read_html(toString(df))
df <- as.data.frame(html_table(df, fill=TRUE))
df$district <- i
Parl_all[[i]] <- df
}

但它给了我以下错误:

``Error in `$<-.data.frame`(`*tmp*`, "session", value = 1L) : 

替换有 1 行,数据有 0''

显然,数据没有被抓取。有什么想法吗?

这是因为您只是将数字 1 到 435 粘贴到 url 的"id"字段中。您需要国会选区的简称,如AZ01VA03等。这是它们的矢量:

districts <- c("AL01", "AL02", "AL03", "AL04", "AL05", "AL06", "AL07", 
"AR01", "AR02", "AR03", "AR04", "AS98", "AZ01", "AZ02", "AZ03", 
"AZ04", "AZ05", "AZ06", "AZ07", "AZ08", "AZ09", "CA01", "CA02", 
"CA03", "CA04", "CA05", "CA06", "CA07", "CA08", "CA09", "CA10", 
"CA11", "CA12", "CA13", "CA14", "CA15", "CA16", "CA17", "CA18", 
"CA19", "CA20", "CA21", "CA22", "CA23", "CA24", "CA25", "CA26", 
"CA27", "CA28", "CA29", "CA30", "CA31", "CA32", "CA33", "CA34", 
"CA35", "CA36", "CA37", "CA38", "CA39", "CA40", "CA41", "CA42", 
"CA43", "CA44", "CA45", "CA46", "CA47", "CA48", "CA49", "CA50", 
"CA51", "CA52", "CA53", "CO01", "CO02", "CO03", "CO04", "CO05", 
"CO06", "CO07", "CT01", "CT02", "CT03", "CT04", "CT05", "CTZZ", 
"DC98", "DE00", "FL01", "FL02", "FL03", "FL04", "FL05", "FL06", 
"FL07", "FL08", "FL09", "FL10", "FL11", "FL12", "FL13", "FL14", 
"FL15", "FL16", "FL17", "FL18", "FL19", "FL20", "FL21", "FL22", 
"FL23", "FL24", "FL25", "FL26", "FL27", "GA01", "GA02", "GA03", 
"GA04", "GA05", "GA06", "GA07", "GA08", "GA09", "GA10", "GA11", 
"GA12", "GA13", "GA14", "GU98", "HI01", "HI02", "IA01", "IA02", 
"IA03", "IA04", "ID01", "ID02", "IL01", "IL02", "IL03", "IL04", 
"IL05", "IL06", "IL07", "IL08", "IL09", "IL10", "IL11", "IL12", 
"IL13", "IL14", "IL15", "IL16", "IL17", "IL18", "ILZZ", "IN01", 
"IN02", "IN03", "IN04", "IN05", "IN06", "IN07", "IN08", "IN09", 
"KS01", "KS02", "KS03", "KS04", "KY01", "KY02", "KY03", "KY04", 
"KY05", "KY06", "LA01", "LA02", "LA03", "LA04", "LA05", "LA06", 
"MA01", "MA02", "MA03", "MA04", "MA05", "MA06", "MA07", "MA08", 
"MA09", "MD01", "MD02", "MD03", "MD04", "MD05", "MD06", "MD07", 
"MD08", "ME01", "ME02", "MI01", "MI02", "MI03", "MI04", "MI05", 
"MI06", "MI07", "MI08", "MI09", "MI10", "MI11", "MI12", "MI13", 
"MI14", "MIZZ", "MN01", "MN02", "MN03", "MN04", "MN05", "MN06", 
"MN07", "MN08", "MO01", "MO02", "MO03", "MO04", "MO05", "MO06", 
"MO07", "MO08", "MS01", "MS02", "MS03", "MS04", "MT00", "NA98", 
"NC01", "NC02", "NC03", "NC04", "NC05", "NC06", "NC07", "NC08", 
"NC09", "NC10", "NC11", "NC12", "NC13", "ND00", "NE01", "NE02", 
"NE03", "NH01", "NH02", "NJ01", "NJ02", "NJ03", "NJ04", "NJ05", 
"NJ06", "NJ07", "NJ08", "NJ09", "NJ10", "NJ11", "NJ12", "NM01", 
"NM02", "NM03", "NV01", "NV02", "NV03", "NV04", "NY01", "NY02", 
"NY03", "NY04", "NY05", "NY06", "NY07", "NY08", "NY09", "NY10", 
"NY11", "NY12", "NY13", "NY14", "NY15", "NY16", "NY17", "NY18", 
"NY19", "NY20", "NY21", "NY22", "NY23", "NY24", "NY25", "NY26", 
"NY27", "OH01", "OH02", "OH03", "OH04", "OH05", "OH06", "OH07", 
"OH08", "OH09", "OH10", "OH11", "OH12", "OH13", "OH14", "OH15", 
"OH16", "OK01", "OK02", "OK03", "OK04", "OK05", "OR01", "OR02", 
"OR03", "OR04", "OR05", "PA01", "PA02", "PA03", "PA04", "PA05", 
"PA06", "PA07", "PA08", "PA09", "PA10", "PA11", "PA12", "PA13", 
"PA14", "PA15", "PA16", "PA17", "PA18", "PR98", "RI01", "RI02", 
"SC01", "SC02", "SC03", "SC04", "SC05", "SC06", "SC07", "SD00", 
"TN01", "TN02", "TN03", "TN04", "TN05", "TN06", "TN07", "TN08", 
"TN09", "TX01", "TX02", "TX03", "TX04", "TX05", "TX06", "TX07", 
"TX08", "TX09", "TX10", "TX11", "TX12", "TX13", "TX14", "TX15", 
"TX16", "TX17", "TX18", "TX19", "TX20", "TX21", "TX22", "TX23", 
"TX24", "TX25", "TX26", "TX27", "TX28", "TX29", "TX30", "TX31", 
"TX32", "TX33", "TX34", "TX35", "TX36", "UT01", "UT02", "UT03", 
"UT04", "VA01", "VA02", "VA03", "VA04", "VA05", "VA06", "VA07", 
"VA08", "VA09", "VA10", "VA11", "VI98", "VT00", "WA01", "WA02", 
"WA03", "WA04", "WA05", "WA06", "WA07", "WA08", "WA09", "WA10", 
"WI01", "WI02", "WI03", "WI04", "WI05", "WI06", "WI07", "WI08", 
"WV01", "WV02", "WV03", "WY00")

下面是使用此向量中的前几个元素的完整工作示例:

library(stringr)
library(rvest)
districts <- c("AL01", "AL02", "AL03", "AL04", "AL05", "AL06", "AL07", 
"AR01", "AR02", "AR03", "AR04", "AS98", "AZ01", "AZ02", "AZ03")
get_table <- function(district) 
{
"https://www.opensecrets.org/races/summary"                                  %>%
paste0("?cycle=2018&id=", district, "&spec=N")                               %>%
readLines()                                                                  %>%
str_replace_all("<img src='images/check.gif'>", "<font size='2'>Yes</font>") %>%
toString()                                                                   %>%
read_html()                                                                  %>%
html_table(fill = TRUE)                                                      %>%
as.data.frame()
}
Parl_all        <- lapply(districts, get_table)
names(Parl_all) <- districts

您现在有一个以每个国会选区命名的列表,因此您可以这样做

Parl_all$AL01
#>                                                                                                        Candidate
#> 1 ,                           Bradley Byrne (R),  • Incumbent • Winner                          (63.2% of vote),
#> 2                 ,                           Robert Kennedy Jr. (D),                           (36.8% of vote),
#>       Raised    Spent Cash.on.Hand Last.Report
#> 1 $1,460,041 $831,634   $1,074,725  12/31/2018
#> 2    $46,845  $46,845           $0  12/31/2018

最新更新