如何用R爬取Finanznachrichten多页新闻标题及发布时间?
解决方案
1. 抓取小时级发布时间
当前代码直接抓取表格会丢失小时级时间(页面原始HTML中,新闻的小时级时间存放在独立的节点里,表格渲染时可能只展示日期)。需要直接解析新闻条目标签,而非依赖html_table批量提取:
library(rvest) library(dplyr) library(polite) # 初始化会话,设置合规的用户代理 col_link <- "https://www.finanznachrichten.de/nachrichten/nachrichten-alle.htm" session <- bow(col_link, user_agent = "R crawler (your-email@example.com)") # 定义单页数据抓取函数 scrape_single_page <- function(session) { page_content <- scrape(session) # 定位所有新闻条目行 news_rows <- page_content %>% html_nodes("table tr:not(.tableheader)") # 提取标题与完整发布时间 data.frame( title = news_rows %>% html_node(".newsheadline a") %>% html_text(trim = TRUE), publish_time = news_rows %>% html_node(".newstime") %>% html_text(trim = TRUE), stringsAsFactors = FALSE ) } # 测试单页抓取效果 first_page_data <- scrape_single_page(session) head(first_page_data)
.newstime节点就是存储小时级时间的元素,直接解析即可拿到类似10.10.2024 14:35的完整时间格式。
2. 处理多页抓取
该网站的分页链接格式为nachrichten-alle-[页码].htm(例如第二页URL为https://www.finanznachrichten.de/nachrichten/nachrichten-alle-2.htm),可以通过两种方式实现多页抓取:
方案A:构造分页URL循环抓取
# 定义要抓取的页码范围(1-5页) target_pages <- 1:5 # 循环抓取所有页面数据 all_news_data <- lapply(target_pages, function(page_num) { # 构造对应页码的URL page_url <- if (page_num == 1) { col_link } else { gsub("\\.htm", paste0("-", page_num, ".htm"), col_link) } # 创建会话并抓取数据 page_session <- bow(page_url, user_agent = "R crawler (your-email@example.com)") scrape_single_page(page_session) }) %>% bind_rows() # 查看总数据量与前几行结果 dim(all_news_data) head(all_news_data)
方案B:从页面提取分页链接(更稳健)
如果网站分页规则可能变动,建议从页面底部的分页导航栏提取所有目标链接:
# 抓取第一页并提取所有分页链接 first_page <- scrape(session) pagination_links <- first_page %>% html_nodes(".pagination a") %>% html_attr("href") %>% paste0("https://www.finanznachrichten.de", .) %>% unique() # 补充第一页链接 all_page_links <- c(col_link, pagination_links) # 循环抓取所有页面 all_news_data <- lapply(all_page_links, function(link) { page_session <- bow(link, user_agent = "R crawler (your-email@example.com)") scrape_single_page(page_session) }) %>% bind_rows()
注意事项
- 必须设置包含联系方式的
user_agent,避免被网站判定为恶意爬虫封禁IP。 - 在循环中添加
Sys.sleep(1)控制请求间隔,遵守网站robots.txt规则。 - 若遇到反爬拦截,可尝试用
httr::add_headers添加Referer等请求头模拟浏览器行为。
内容的提问来源于stack exchange,提问作者user149240
相关产品推荐
相关产品推荐

