2017-07-19 40 views
0

我正在使用网络抓取程序来搜索多个工作表中的数据。下面的代码是我正在使用的一个例子。我只能得到第一张纸。如果有人能够指出我的语法错误,那将会非常有帮助。使用R的Web网页刮取多个链接

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]

按照上面的代码,我只能从第一页和页面不休息获取数据。也没有语法错误。你能帮我找出我出错的地方吗?

+0

不要你需要使用'do.call(rbind,dflist)'代替'do.call (cbind,dflist)'?此外,包含错误描述(根据您的情况)并包含可能的错误消息或不正确的输出总是很好的。 – Jaap

+1

一个类似问题的例子:https://stackoverflow.com/questions/40525661/how-to-scrape-mutiple-tables-indexing-both-yearpage – Jaap

+0

@Jaap问题是在dflist循环 – Tanuvi

回答

1

一些网站提供安全措施以防止散装刮擦。我想这是其中之一。更多的是:https://github.com/JonasCz/How-To-Prevent-Scraping/blob/master/README.md

事实上,如果你延迟了一些你的电话,这将工作。我试过w/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, .) 

最佳,

科林

+0

这非常有帮助。非常感谢你......这正是我所期待的。 – Tanuvi

+0

总是乐于帮助:) –