使用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
相关产品推荐
相关产品推荐

