Web使用R

时间:2017-07-19 06:20:03

标签: r web-scraping lapply rvest

我正在开发一个网络抓取程序,用于搜索多张纸张中的数据。下面的代码是我正在使用的一个例子。我只能得到第一张。如果有人能在我的语法中指出我出错的地方,将会有很大的帮助。

jump <- seq(1, 10, by = 1)

site <- paste0("https://stackoverflow.com/search?page=",jump,"&tab=Relevance&q=%5bazure%5d%20free%20tier")


dflist <- lapply(site, function(i) {
   webpage <- read_html(i)
  draft_table <- html_nodes(webpage,'.excerpt')
  draft <- html_text(draft_table)
})



finaldf <- do.call(cbind, dflist) 

finaldf_10<-data.frame(finaldf)

View(finaldf_10)

以下是我需要抓取数据的链接  127页。

[https://stackoverflow.com/search?q=%5Bazure%5D+free+tier][1]

根据上面的代码,我只能从第一页获取数据,而不能从其他页面获取数据。也没有语法错误。你能不能帮我找出我错的地方。

1 个答案:

答案 0 :(得分:1)

某些网站提供安全措施以防止批量抓取。我想这就是其中之一。更多相关内容:https://github.com/JonasCz/How-To-Prevent-Scraping/blob/master/README.md

事实上,如果你延迟一点电话,这将有效。我已经尝试了5秒Sys.sleep。我想你可以减少它,但这可能不起作用(我尝试了1秒Sys.sleep,但没有用)。

这是一个有效的代码:

library(rvest)
library(purrr)

dflist <- map(.x = 1:10, .f = function(x) {
  Sys.sleep(5)
  url <- paste0("https://stackoverflow.com/search?page=",x,"&q=%5bazure%5d%20free%20tier")
  read_html(url) %>%
    html_nodes('.excerpt') %>%
    html_text() %>%
    as.data.frame()
}) %>% do.call(rbind, .)

最好,

科林