使用 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)
})
我有一个数据框,其中一列包含指向我想用 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)
})