You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

爬取俄罗斯联邦官网总统演讲时遭遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:04:05