爬取俄罗斯联邦官网总统演讲时遭遇80端口连接超时错误的解决咨询
爬取俄罗斯联邦官网总统演讲时遭遇80端口连接超时错误的解决咨询
看起来你遇到了典型的爬虫反爬拦截或者协议兼容问题,我来给你几个针对性的修改建议,帮你解决这个超时错误:
切换到HTTPS协议:
你当前使用的http://kremlin.ru是HTTP协议(默认走80端口),现在绝大多数官方网站已经强制启用HTTPS协议,HTTP请求可能会被服务器限流、重定向甚至直接拒绝。把所有请求链接里的http替换成https,修改后的代码片段如下:# 列表页链接修改 link = paste0("https://www.kremlin.ru/events/president/transcripts/page/", page_result) # 演讲详情页链接拼接修改 speech_links = page %>% html_nodes(".hentry__title_special a") %>% html_attr("href") %>% paste("https://www.kremlin.ru", ., sep = "")切换到HTTPS后请求会走443端口,更符合网站当前的服务配置,这大概率能解决端口超时的核心问题。
添加浏览器请求头,模拟真实用户访问:
无请求头的爬虫请求很容易被服务器识别并拦截。你可以在调用read_html时添加一个真实的浏览器用户代理(User-Agent),模拟正常浏览器访问:# 先定义一个常见的Chrome浏览器用户代理 my_ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" # 修改列表页请求 page = read_html(link, user_agent = my_ua) # 修改详情页请求 speech_page = read_html(speech_link, user_agent = my_ua)优化请求间隔与添加重试机制:
你已经添加了Sys.sleep控制请求频率,但当前1.5-3秒的间隔可能还是偏短,建议调整到3-6秒,进一步降低被限流的概率。另外,添加重试逻辑,当单次请求超时失败时自动重试1-2次,避免程序直接中断:# 重写get_speech函数,加入重试逻辑 get_speech = function(speech_link, max_retry = 2) { attempt = 1 result = NULL while(attempt <= max_retry && is.null(result)) { tryCatch({ speech_page = read_html(speech_link, user_agent = my_ua) # 以下保留你原函数的逻辑不变 speech_name_full = speech_page %>% html_nodes(".p-name") %>% html_text() speech_published = speech_page %>% html_nodes(".read__published") %>% html_text() speech_text_list = speech_page %>% html_nodes(".read__internal_content > p") %>% html_text() speech_text_merged_n = speech_text_list %>% paste(collapse = "\n") speech_text = gsub("\n", " ", speech_text_merged_n) speech_filename = substr(speech_name_full, 1, 200) filename_unclean = paste0(speech_published, " - ", speech_filename, ".txt") filename = str_remove_all(filename_unclean, "[/>+'|=_?;:<}{!@#$%^&*()]") write.table( speech_text_list, file = filename, row.names = FALSE, col.names = FALSE, append = FALSE, quote = FALSE, eol = "\r\r" ) random_number = runif(1, 3, 6) Sys.sleep(random_number) result = speech_text }, error = function(e) { message(paste("请求失败,重试第", attempt, "次:", e$message)) attempt = attempt + 1 Sys.sleep(runif(1, 2, 4)) # 重试前等待更久 }) } return(result) } # 同时修改循环里的等待时间 random_number = runif(1, 3, 6) Sys.sleep(random_number)检查网络环境:
如果以上修改后仍然出现超时,可能是你的网络环境对该网站存在访问限制。这种情况下,可以考虑使用合法合规的代理服务(请遵守相关法律法规及网站的robots协议),并在read_html中通过proxy参数配置代理信息。
备注:内容来源于stack exchange,提问作者w5698
相关产品推荐
相关产品推荐

