使用 rvest 抓取 df 列中的链接

Scraping links in df columns with rvest

我有一个数据框,其中一列包含指向我想用 rvest 抓取的网页的链接。我想下载一些链接,将它们存储在另一个列中,并从中下载一些文本。我尝试使用 lapply 来做到这一点,但我在第二步得到了 Error in UseMethod("xml_find_all") : no applicable method for 'xml_find_all' applied to an object of class "function" 。也许问题可能是第一个链接被保存为列表。你知道我怎么解决吗?

这是我的 MWE(在我的完整数据集中,我有大约 5000 个链接,我应该使用 Sys.sleep 以及如何使用吗?)

library(rvest)

df <- structure(list(numeroAtto = c("2855", "2854", "327", "240", "82"
), testo = c("http://dati.camera.it/ocd/versioneTestoAtto.rdf/vta18_leg.18.pdl.camera.2855.18PDL0127540", 
             "http://dati.camera.it/ocd/versioneTestoAtto.rdf/vta18_leg.18.pdl.camera.327.18PDL0003550",
             "http://dati.camera.it/ocd/versioneTestoAtto.rdf/vta18_leg.18.pdl.camera.327.18PDL0003550", 
             "http://dati.camera.it/ocd/versioneTestoAtto.rdf/vta18_leg.18.pdl.camera.240.18PDL0007740", 
             "http://dati.camera.it/ocd/versioneTestoAtto.rdf/vta18_leg.18.pdl.camera.82.18PDL0001750"
)), row.names = c(NA, 5L), class = "data.frame")

df$links_text <- lapply(df$testo, function(x) {
  page <- read_html(x)
  links <- html_nodes(page, '.value:nth-child(8) .fixed') %>%
    html_text(trim = T)
})

df$text <- lapply(df$links_text, function(x) {
  page1 <- read_html(x)
  links1 <- html_nodes(page, 'p') %>%
    html_text(trim = T)
})

您希望 links1 <- html_nodes(page, 'p') 引用 page1,而不是 page

[否则(由于函数环境中没有对象page,它正在尝试将html_nodes应用于utils函数page]

Sys_sleep而言,它是相当可选的。查看页面html,看看代码或用户协议中是否有禁止抓取的内容。如果是这样,那么更友好地抓取服务器可能会增加你不被阻止的机会!

您可以只在创建 df$text 的函数中包含 Sys.sleep(n)。 n 由你决定,我有 1-3 秒的运气,但它确实变得漂亮 slow/long!

您可以在单个 sapply 命令中执行此操作并使用 tryCatch 来处理错误。

library(rvest)

df$text  <- sapply(df$testo, function(x) {
  tryCatch({
    x %>%
      read_html() %>%
      html_nodes('.value:nth-child(8) .fixed') %>%
      html_text(trim = T) %>%
      read_html %>%
      html_nodes('p') %>%
      html_text(trim = T) %>%
      toString()
  }, error = function(e) NA)
})