R: очистить несколько URL-адресов с помощью команд pipechain в Rvest

У меня есть список chr с несколькими URL-адресами. Я хочу загрузить контент с каждого из этих URL-адресов.

Чтобы избежать написания сотен команд, я хочу автоматизировать процесс с помощью цикла с использованием lapply.

Однако моя команда возвращает ошибку. Можно ли очистить несколько URL-адресов?

Текущие подходы

Длинный метод: работает, но я хочу его автоматизировать

urls <-c("https://en.wikipedia.org/wiki/Belarus","https://en.wikipedia.org/wiki/Russia","https://en.wikipedia.org/wiki/England")

library(rvest)
library(httr) # required for user_agent command

uastring <- "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
session <- html_session("https://en.wikipedia.org/wiki/Main_Page", user_agent(uastring))
session2<-jump_to(session, "https://en.wikipedia.org/wiki/Belarus")
session3<-jump_to(session, "https://en.wikipedia.org/wiki/Russia")
writeBin(session2$response$content, "test1.txt") 
writeBin(session3$response$content, "test2.txt")

Автомат / цикл: не работает.

urls <-c("https://en.wikipedia.org/wiki/Belarus","https://en.wikipedia.org/wiki/Russia","https://en.wikipedia.org/wiki/England")

library(rvest)
library(httr) # required for user_agent command

uastring <- "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
session <- html_session("https://en.wikipedia.org/wiki/Main_Page", user_agent(uastring))
lapply(urls, .%>% jump_to(session))
Error: is.session(x) is not TRUE

Резюме

Я хочу автоматизировать следующие два процесса, jump_to() и writeBin(), как показано в приведенном ниже коде.

session2<-jump_to(session, "https://en.wikipedia.org/wiki/Belarus")
session3<-jump_to(session, "https://en.wikipedia.org/wiki/Russia")
writeBin(session2$response$content, "test1.txt") 
writeBin(session3$response$content, "test2.txt")

person G. Gip    schedule 28.03.2016    source источник


Ответы (1)


Вы можете сделать что-то вроде этого:

urls <-c("https://en.wikipedia.org/wiki/Belarus","https://en.wikipedia.org/wiki/Russia","https://en.wikipedia.org/wiki/England")
require(httr)
require(rvest)
uastring <- "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
session <- html_session("https://en.wikipedia.org/wiki/Main_Page", user_agent(uastring))

outfile <- sprintf("%s.html", sub(".*/", "", urls))

jump_and_write <- function(x, url, out_file){
  tmp = jump_to(x, url)
  writeBin(tmp$response$content, out_file) 
}

for(i in seq_along(urls)){
  jump_and_write(session, urls[i], outfile[i])
}
person Rentrop    schedule 29.03.2016
comment
Не могли бы вы объяснить, почему первоначальный метод использования lapply() не сработал? Насколько я понимаю, он выполняет цикл функции по списку, почти так же, как цикл for(). - person G. Gip; 05.04.2016
comment
Вы использовали переданные аргументы в неправильном порядке: lapply(urls, .%>% jump_to(session)) использует jump_to(url, session), но jump_to ожидает jump_to(session, url). Вы можете исправить это, используя lapply(urls, .%>% jump_to(session, .)). Взгляните на? Magrittr :: _ 6_ (поместите `вокруг%›%) - person Rentrop; 05.04.2016
comment
Спасибо. Можно ли связать последнюю writeBin() команду с помощью pipechain? - person G. Gip; 05.04.2016