【发布时间】:2016-12-27 14:55:33
【问题描述】:
我正在使用“rvest”包抓取this website。当我多次迭代我的函数时,我得到“open.connection(x,“rb”)中的错误:达到超时”。我已经搜索过类似的问题,但答案似乎会导致死胡同。我怀疑它是服务器端的,并且该网站对我可以访问该页面的次数有内置限制。如何研究这个假设?
代码:我有指向底层网页的链接,并想用从相关网页中提取的信息构建一个数据框。我已经稍微简化了我的抓取功能,因为使用更简单的功能仍然会出现问题:
scrape_test = function(link) {
slit <- str_split(link, "/") %>%
unlist()
id <- slit[5]
sem <- slit[6]
name <- link %>%
read_html(encoding = "UTF-8") %>%
html_nodes("h2") %>%
html_text() %>%
str_replace_all("\r\n", "") %>%
str_trim()
return(data.frame(id, sem, name))
}
我使用 purrr-package map_df() 来迭代函数:
test.data = links %>%
map_df(scrape_test)
现在,如果我只使用 50 个链接迭代函数,我不会收到任何错误。但是当我增加链接数量时,我遇到了前面提到的错误。此外,我收到以下警告:
- “在 bind_rows_(x, .id) 中:不等因子级别:强制转换为字符”
- “关闭未使用的连接 4 (link)”
编辑:以下创建链接对象的代码可用于重现我的结果:
links <- c(rep("http://karakterstatistik.stads.ku.dk/Histogram/NMAK13032E/Winter-2013/B2", 100))
【问题讨论】:
-
我忘记了“链接 %>%”,因为我在堆栈溢出中直接简化了我的函数,对此感到抱歉。问题在于多次迭代,当您到达太多链接时它突然给出错误。
-
也许尝试在您的函数中插入
Sys.sleep(x)(插入您选择的x)以在请求之间暂停? -
是的,这绝对是一个可能的解决方案。我怎么知道“x”应该是什么?有什么技巧还是反复试验?但是,由于我想迭代 1000 个链接作为开始和可能的 32000 个链接,我可能需要另一个解决方案,因为设置 x=2 需要很长时间才能运行。
标签: r function web-scraping rvest