使用R语言rvest包爬取Instagram博客无法获取文章正文问题求助
问题原因
- CSS选择器语法错误:多类名元素选择不能用空格分隔,空格是后代选择符,你的写法实际是查找对应类名下的同名标签,该类标签不存在因此返回空。多类名选择需要用
.直接拼接类名,例如同时匹配a、b两个类的元素要写为.a.b。 - 选择器稳定性差:你使用的
_8ig0、_9g5w这类名称是Instagram前端自动生成的哈希类名,会随页面版本更新频繁变动,即使修正语法也可能随时失效。 - 原有代码存在笔误:抓取作者日期的代码中,管道符被注释符号遮挡,导致
html_text()没有生效,拿到的是节点对象而非文本内容。
解决方案
修正后的可运行代码如下,提供两种正文抓取方案可选:
library(tidyverse) library(rvest) library(stringr) # 目标页面链接 url <- 'https://about.instagram.com/blog/announcements/break-down-how-instagram-search-works' # 单次读取页面,避免重复请求 page <- read_html(url) # 抓取文章标题 titles <- page %>% html_nodes('h1') %>% html_text() # 抓取作者与发布日期,修正管道符注释问题 author_date <- page %>% html_nodes('._8hlt ._8hlu') %>% html_text() author <- author_date[1] date <- author_date[2] # 正文抓取方案1:修正原选择器语法,适配当前页面类名 text <- page %>% html_nodes("._8ig0._8g86 ._9g5w._8iq8._8ipi p") %>% html_text() # 正文抓取方案2:语义化定位,不依赖哈希类名,后续稳定性更高 # text <- page %>% # html_elements("article p") %>% # html_text() # 合并所有段落为完整文本 full_article_text <- str_c(text, collapse = "\n\n")
代码说明:
- 单次读取页面存储为变量,避免重复发起请求,提升抓取效率
- 方案2通过
<article>语义标签定位正文区域,不受前端类名迭代影响,更适合长期使用 - 最终得到的
full_article_text就是合并好的完整正文内容
内容的提问来源于stack exchange,提问作者lotta_schlotter
相关产品推荐
相关产品推荐

