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

使用rvest爬取新加坡外籍人士论坛遇报错及空CSV问题求助

论坛数据爬取问题修复方案

错误原因

你获取的thread_links是相对路径(例如./viewforum.php?f=84&sid=xxx),直接传入read_html()会被识别为本地文件路径,导致系统找不到对应文件,进而中断爬取流程,最终导出空CSV。

修复步骤与完整代码

library(rvest)
library(dplyr)
library(stringr)
library(purrr)
library(httr)

# 论坛基础URL
base_url <- "https://forum.singaporeexpats.com/"

# 设置请求头,模拟浏览器访问(避免反爬拦截)
headers <- add_headers(
  "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
)

# 抓取论坛首页的主题、链接、作者、浏览量
h <- GET(base_url, headers) %>% read_html()

threads <- h %>%
  html_nodes("#page-body .list-inner a") %>%
  html_text() %>%
  str_squish()

# 拼接完整URL(用url_absolute确保路径正确)
thread_links <- h %>%
  html_nodes("#page-body .list-inner a") %>%
  html_attr("href") %>%
  url_absolute(base_url)

# 抓取作者信息
authors <- h %>%
  html_nodes("#page-body .list-inner .author") %>%
  html_text() %>%
  str_squish()

# 抓取浏览量
views <- h %>%
  html_nodes("#page-body .list-inner .views") %>%
  html_text() %>%
  str_extract("\\d+") %>%  # 提取数字部分
  as.integer()

# 自定义函数:抓取单条主题下的帖子内容与用户信息
scrape_thread_data <- function(thread_url){
  # 捕获请求错误,避免单条失败中断全部流程
  tryCatch({
    page <- GET(thread_url, headers) %>% read_html()
    
    # 帖子内容
    messages <- page %>%
      html_nodes(".content") %>%
      html_text() %>%
      str_squish()
    
    # 发帖用户
    users <- page %>%
      html_nodes(".postprofile strong a") %>%
      html_text() %>%
      str_squish()
    
    # 返回数据框,方便后续合并
    tibble(user = users, message = messages)
  }, error = function(e){
    # 请求失败时返回空数据框
    tibble(user = character(0), message = character(0))
  })
}

# 构建完整数据集
master_data <- tibble(
  thread_title = threads,
  thread_author = authors,
  thread_views = views,
  thread_url = thread_links
) %>%
  mutate(thread_content = map(thread_url, scrape_thread_data)) %>%
  unnest(thread_content)  # 展开嵌套的帖子数据

# 导出CSV
write.csv(master_data, "forum_practice.csv", row.names = FALSE)

关键修改说明

  • URL拼接:用url_absolute()将相对路径转为完整URL,确保read_html()访问正确的网页而非本地文件。
  • 反爬处理:添加User-Agent请求头,模拟正常浏览器访问,降低被论坛反爬机制拦截的概率。
  • 错误捕获:用tryCatch()包裹请求逻辑,单条主题爬取失败时不会中断整个流程,避免最终导出空文件。
  • 数据完善:补充了作者、浏览量的抓取,以及帖子对应的用户信息,让数据集更完整。

内容的提问来源于stack exchange,提问作者poor_little_scholar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:35:07