R语言map循环中加入purrr::slowly或Sys.sleep设置请求间隔的方法
实现方案
方案1:在map迭代逻辑中插入休眠判断
总共7次请求仅需要在非首次请求前休眠10秒即可,无需修改其余业务逻辑,直接替换你原有map部分的代码即可:
# 替换原有map代码块 map(., function(url, index) { # 除第一次请求外,其余请求执行前先休眠10秒 if (index != 1) { Sys.sleep(10) } # 原有爬取逻辑,已修复原代码中bind_rows后缺失的管道符语法问题 read_html(url) %>% html_table() %>% .[[1]] %>% # 取第一个表格 dplyr::bind_rows() %>% janitor::clean_names() %>% slice(-1) %>% select(-21) %>% rename(nome=1,nacionalidade=2,posicao=3,idade=4,jogos=5,inicios=6,minutos=7,minutos_90=8,gol=9,assistencia=10, gol_normal=11,gol_penalti=12,penalti_batido=13,amarelo=14,vermelho=15,gol_90=16,assistencia_90=17, gol_assistencia_90=18,gol_normal_90=19,gol_assistencia_penalti_90=20) %>% as.data.frame() %>% format(scientific=FALSE) %>% mutate_at(.,c(5:15),as.numeric) %>% mutate(nacionalidade = str_extract(nacionalidade, "[A-Z]+")) }, seq_along(.))
方案2:用purrr::slowly实现更简洁的间隔控制
slowly是purrr专门为函数添加执行间隔的工具,不需要手动判断迭代位置,直接封装爬取逻辑即可:
# 先封装单页爬取函数,用slowly装饰指定间隔 scrape_fbref <- slowly( function(url) { read_html(url) %>% html_table() %>% .[[1]] %>% dplyr::bind_rows() %>% janitor::clean_names() %>% slice(-1) %>% select(-21) %>% rename(nome=1,nacionalidade=2,posicao=3,idade=4,jogos=5,inicios=6,minutos=7,minutos_90=8,gol=9,assistencia=10, gol_normal=11,gol_penalti=12,penalti_batido=13,amarelo=14,vermelho=15,gol_90=16,assistencia_90=17, gol_assistencia_90=18,gol_normal_90=19,gol_assistencia_penalti_90=20) %>% as.data.frame() %>% format(scientific=FALSE) %>% mutate_at(.,c(5:15),as.numeric) %>% mutate(nacionalidade = str_extract(nacionalidade, "[A-Z]+")) }, rate = rate_delay(pause = 10) # 指定两次执行间隔为10秒 ) # 原有map部分直接调用封装好的函数即可 map(., scrape_fbref)
可选优化
如果仍偶发超时,可搭配purrr::safely或者httr::RETRY给请求增加重试逻辑,避免单次网络波动导致整个任务中断。
内容的提问来源于stack exchange,提问作者fabiominatto
相关产品推荐
相关产品推荐

