【问题标题】:R: Scrape multiple urls using pipechain commands in RvestR:在 Rvest 中使用管道链命令抓取多个 url
【发布时间】:2023-03-10 08:51:01
【问题描述】:

我有一个包含多个 url 的 chr 列表。我想从这些网址中的每一个下载内容。

为了避免写出数百条命令,我希望使用 lapply 循环自动执行该过程。

但是我的命令返回错误。是否可以从多个网址中抓取?

目前的方法

长方法:有效,但我希望自动化

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")

【问题讨论】:

    标签: r web-scraping rcurl rvest httr


    【解决方案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])
    }
    

    【讨论】:

    • 您能解释一下为什么使用lapply() 的原始方法不起作用吗?我的理解是它在列表上循环一个函数,与for() 循环的工作原理大致相同。
    • 您以错误的顺序传递参数:lapply(urls, .%&gt;% jump_to(session)) 使用 jump_to(url, session)jump_to 期望 jump_to(session, url)。您可以使用lapply(urls, .%&gt;% jump_to(session, .)) 解决此问题。看看 ?magrittr::%&gt;%(将 ` 放在 %>% 周围)
    • 谢谢。是否可以通过管道链接最终的writeBin() 命令?
    猜你喜欢
    • 2020-06-08
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多