rvest爬取丹麦议会网站缺失最新数据及LIU委员会链接问题
问题排查与修复方案
问题1:最新数据缺失
产生原因
- 本地缓存逻辑有漏洞:代码中仅对2021年的页面做了强制重新拉取的处理,其余所有年份只要本地存在已归档的html文件,就直接读取本地旧文件,不会重新向网站发起请求获取最新内容。网站后续新增的议程条目不会出现在旧归档文件中,自然无法被抓取。
- 时间范围设置过时:代码中设置的爬取年份上限
last.yr=2022,未覆盖2023年及之后的新会期内容。 - 旧归档文件中的总结果数、分页信息都是首次爬取时的历史数据,就算后续网站新增条目,基于旧数据计算的分页数量也会偏少,无法遍历到新内容所在的位置。
解决方案
- 统一所有年份的缓存刷新逻辑,给本地缓存设置7天的有效期,过期自动重新拉取页面覆盖旧文件,无需单独给2021年写特殊逻辑。
- 将爬取年份上限
last.yr调整为当前年份,覆盖所有新会期。 - 拉取新页面时重新计算总结果数和分页数,保证分页遍历完整。
问题2:LIU委员会议程链接提取错误
产生原因
- 给LIU委员会单独写的链接提取规则范围过宽:选择器
.column-documents__link会匹配页面中所有带该class的元素,包括面包屑导航、侧边栏、页脚的链接,其中根路径/被拼接域名后就变成了https://www.ft.dk/。 - 提取时加了
unique()去重,打乱了链接顺序,和之前抓取的标题、日期无法对应,最终返回大量无效根域名链接。 - LIU页面的DOM结构和其他委员会没有本质差异,不需要单独写提取规则,通用的精准定位规则完全适用。
解决方案
- 删除LIU、FOU、GRU等委员会的单独提取分支,统一用「先定位每条议程的父容器,再从容器内提取对应字段」的逻辑,从根源上避免日期、标题、链接长度不匹配、顺序错位的问题。
- 链接提取统一用精准选择器定位标题列下的a标签,不要用宽范围选择器抓无关元素。
附加:CSS选择器报错原因
你写的选择器.highlighted .column-documents__icon-text']末尾多了一个多余的右单引号和方括号,属于CSS语法错误,所以触发tokenize报错。另外这个选择器定位的是文本容器,不是a标签,就算语法正确也拿不到href属性。
修正后的核心代码片段
缓存逻辑替换
# 统一缓存刷新规则,删除原来单独判断2021年的分支 refresh_cycle <- 7 # 本地缓存7天过期 if (file.exists(file.name)) { file_mtime <- file.info(file.name)$mtime if (difftime(Sys.time(), file_mtime, units = "days") > refresh_cycle) { page <- read_html(final.url) write(as.character(page), file = file.name) Sys.sleep(2 + rpois(1, 2)) } else { page <- read_html(file.name) } } else { page <- read_html(final.url) write(as.character(page), file = file.name) Sys.sleep(2 + rpois(1, 2)) }
字段提取逻辑替换
# 删除原来分委员会判断标题、链接的分支,统一提取逻辑 # 先定位每条议程的父容器,保证三个字段长度、顺序完全匹配 items <- page %>% html_elements(".document-list__item, tr") %>% discard(~length(html_element(.x, "td[data-title='Titel'] a.column-documents__link")) == 0) dates <- items %>% html_element('.highlighted .column-documents__icon-text') %>% html_text(trim = T) titles <- items %>% html_element('.column-documents__icon-text') %>% html_text(trim = T) links <- items %>% html_element('td[data-title="Titel"] a.column-documents__link') %>% html_attr('href') %>% paste0("https://www.ft.dk", .)
内容的提问来源于stack exchange,提问作者Asbjørn
相关产品推荐
相关产品推荐

