Более быстрый парсинг веб-страниц с R - PullRequest
0 голосов
/ 30 мая 2020

Мне нужна помощь, чтобы ускорить очистку веб-страниц с помощью R. Мне нужно очистить некоторые данные примерно с 23000 веб-страниц, но мне нужно сделать это быстрее, чем за 2 часа (!), И я не знаю, как улучшить свой сценарий для достижения цели (я новичок в R!). Вот пример страницы: https: // "sample" / 46351, и каждая страница характеризуется кодом в конце URL-адреса. В Codes $ id есть все коды. Кто-нибудь может дать мне совет? Есть какие-нибудь функции для ускорения всего? Здесь прикреплен код. Большое спасибо за помощь!

> cr <- c()
> pr <- c()
> vig <- c()
> ges <- c()
> tabellafinale <- NULL
> tabellafinale <- data.table(ges,cr, pr, vig,stringsAsFactors = FALSE)
> imp <- Codes$id
> str1 <- "https://"sample"/"
> for (p in 1:length(imp)) {
+   
+   try(   
+     {
+       str2 <- imp[p]
+       str3 <- paste(str1,str2,sep="")
+       page<-read_html(str3)    
+       carr<-html_text(html_nodes(page,".span3"))    
+       prez<-html_text(html_nodes(page,".carbFormat"))    
+       viag<-html_text(html_nodes(page,".span5"))    
+       gest <- str2    
+       carr<-gsub("\n","",carr)    
+       via<-gsub("\n","",via)
+       pre<-gsub("\n","",pre)
+       carr<-gsub("\r","",carr)
+       via<-gsub("\r","",via)
+       pre<-gsub("\r","",pre)
+       carr<-gsub("\t","",carr)
+       via<-gsub("\t","",via)
+       pre<-gsub("\t","",pre)
+       car <- data.table(carr)
+       n <- length(carr)
+       carb <- carr[7:n]
+       cr <- data.table(carb)
+       prezzi <- data.table(pre)
+       vigore <- data.table(via)
+       ges <- data.table(gest)
+       oss <- data.table(ges,cr, pr, vig, stringsAsFactors = FALSE)
+       tabellafinale <- rbind(tabellafinale, oss)   
+     }
+     , silent=T
+   )
+   closeAllConnections()
+ }

1 Ответ

1 голос
/ 30 мая 2020

Вы можете попробовать:

library(rvest)

tabellafinale <- do.call(rbind, lapply(Codes$id, function(str2) {
  try({
    str3 <- paste0(str1,str2)
    page<-read_html(str3)
    carr<-html_text(html_nodes(page,".span3"))
    prez<-html_text(html_nodes(page,".carbFormat"))
    viag<-html_text(html_nodes(page,".span5"))
    carr<- gsub("[\n\r\t]","",carr)
    prez<- gsub("[\n\r\t]","",prez)
    viag<- gsub("[\n\r\t]","",viag)
    carb <- carr[7:length(carr)]
    data.frame(str2,carb, prez, viag, stringsAsFactors = FALSE)
  }, silent = TRUE)
}))

Вы можете заменить do.call rbind + lapply на map_df с purrr.

tabellafinale <- map_df(Codes$id, function(str2) {
   .....rest of the code
   .....as it is
})
...