在R中跨网页抓取

时间:2018-07-05 20:20:09

标签: html r loops web-scraping

我想建立一个循环以自动进行跨多个页面的网络抓取。到目前为止,这是我一次迭代的代码:

Html.Events.Extra

应更改的部分是“ pagina =“之后的数字。但是,我尝试创建以下简化循环,但它仅返回错误:

Add

同样,这种简化的循环仅抓取了我需要的五个功能中的两个,因此不起作用并返回错误:f(init,x [[i]])中的错误:is.request(y)不为TRUE。我想象在循环中运行html_session()和jump_to()命令有问题。我想知道如何循环自动执行此操作,以避免手工刮掉数千页。

我什至尝试使用lapply创建向量,但是我对函数的编码并不超级自信,我所看到的所有模板都是简单的read_html()命令,而且我不确定如何会将html_session()和jump_to()命令合并到一个函数中。

1 个答案:

答案 0 :(得分:0)

您几乎明白了。您代码中的主要问题是jump_to("?pagina=", i)。。。应该是jump_to(paste0("?pagina=", i))。这是一个完整的解决方案:

library(rvest)
#> Loading required package: xml2

sesh <- html_session("https://www.hcdn.gob.ar/proyectos/resultados-buscador.html?")

scrape_one_page <- function(sesh, i) {
  one_page <- sesh %>% jump_to(paste0("?pagina=", i)) %>% read_html()
  new <- one_page %>% html_nodes('div.dp-metadata span') %>% html_text()
  type.2 <- one_page %>% html_nodes('h4') %>% html_text()
  title <- one_page %>% html_nodes('div.dp-texto') %>% html_text()

  new <- gsub("Iniciado en: ", "", new)
  new <- gsub("Fecha: ", "", new)
  new <- gsub("Expediente Diputados:", "", new)
  new <- gsub("Expediente Senado:", "", new)
  new <- new [-c(3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79)]
  chamber <- new[c(1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58)]
  billnum <- new[c(2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59)]
  fecha <- new[c(3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60)]

  data.frame(chamber, billnum, fecha, title, type.2, stringsAsFactors = F)
}

# This call to lapply basically says:
# ...For each element in 1:5 (i.e., 1, 2, 3, 4, 5):
#   ...call scrape_one_page() with the first argument being equal to one of those elements and with the argument `sesh` equal to `sesh`
# ... then put the results in a list

# so it basically results in: 
# outs <- list(
#  scrap_one_page(1, sesh),
#  scrap_one_page(2, sesh),
#  scrap_one_page(3, sesh),
#  scrap_one_page(4, sesh),
#  scrap_one_page(5, sesh)
# )
outs <- lapply(1:5, scrape_one_page, sesh = sesh)

# then here with do.call(rbind) we combine the list of data frames into a single data frame 
df <- do.call(rbind, outs)

# and finally print the first few rows of the data frame
head(df)
#>     chamber      billnum      fecha
#> 1 Diputados  3967-D-2018 29/06/2018
#> 2 Diputados  3966-D-2018 29/06/2018
#> 3 Diputados  3965-D-2018 29/06/2018
#> 4 Diputados  3964-D-2018 29/06/2018
#> 5 Diputados  3963-D-2018 29/06/2018
#> 6 Diputados  3962-D-2018 29/06/2018
#>                                                                                                                                     title
#> 1 SOLICITAR AL PODER EJECUTIVO DISPONGA LAS MEDIDAS NECESARIAS PARA ASEGURAR LA CONTINUIDAD DEL CICLO LECTIVO EN LA PROVINCIA DEL CHUBUT.
#> 2                                                         EXPRESAR REPUDIO POR LA POLITICA INMIGRATORIA DE LOS ESTADOS UNIDOS DE AMERICA.
#> 3                  EXPRESAR REPUDIO POR EL FRAUDE COMETIDO EL 23 DE JUNIO 2018 EN LA "FEDERACION UNIVERSITARIA DE BUENOS AIRES - FUBA -".
#> 4                         EXPRESAR REPUDIO POR LA REPRESION DE FUERZAS POLICIALES Y DE SEGURIDAD, CONTRA LOS TRABAJADORES DE CRESTA ROJA.
#> 5                          PROHIBENSE LOS DESPIDOS DE LA AGENCIA DE NOTICIAS ESTATAL TELAM S.E. POR EL TERMINO DE 24 MESES PRORROGABLES. 
#> 6              DECLARESE LA SEMANA QUE CONTIENE EL 26 DE JUNIO DE CADA AÑO COMO "SEMANA NACIONAL DE LA PREVENCION DEL CONSUMO DE DROGAS".
#>                   type.2
#> 1 PROYECTO DE RESOLUCIÓN
#> 2 PROYECTO DE RESOLUCIÓN
#> 3 PROYECTO DE RESOLUCIÓN
#> 4 PROYECTO DE RESOLUCIÓN
#> 5        PROYECTO DE LEY
#> 6        PROYECTO DE LEY