使用R语言rvest爬取Goodreads作者、评分及评论数问题求助
问题分析与解决方法
为什么只获取到J.K. Rowling?
主要有两个核心原因:
- 你用了
html_nodes()(复数选择器)定位唯一的div#bookAuthors元素,虽然不会报错,但用html_element()(单数选择器)更贴合场景,能避免后续处理的潜在问题。 - 旧版
html_text()在处理嵌套元素文本时,没法很好地合并子节点内容(比如插画师的文本被放在子span标签里)。rvest 1.0.0+版本的html_text2()更智能,能保留元素间的空格和标点,正确拼接所有文本。
调整后的作者爬取代码:
url <- 'https://www.goodreads.com/book/show/3.Harry_Potter_and_the_Sorcerer_s_Stone?from_search=true&from_srp=true&qid=6Kzw6iKKur&rank=1' library(rvest) library(stringr) authors <- read_html(url) %>% html_element('div#bookAuthors') %>% # 单数选择器定位唯一元素 html_text2() %>% # 更精准的文本提取 trimws() # 去除前后多余空格 print(authors) # 输出:"J.K. Rowling, Mary GrandPré (Illustrator)"
如何获取评分数量和评论数量?
Goodreads给评分、评论数这类核心数据加了data-testid属性,用这个属性定位比类名更稳定(类名可能随页面样式更新变化)。具体实现如下:
获取评分数量
ratings_count <- read_html(url) %>% html_element('span[data-testid="ratingsCount"]') %>% html_text() %>% str_remove_all(",") %>% # 移除数字里的逗号分隔符 as.numeric() print(ratings_count) # 输出类似:8898507
获取评论数量
reviews_count <- read_html(url) %>% html_element('span[data-testid="reviewsCount"]') %>% html_text() %>% str_remove_all(",") %>% as.numeric() print(reviews_count) # 输出类似:1234567
额外提示
- 爬取Goodreads时别太频繁请求,避免被封IP,可以加个请求间隔(比如
Sys.sleep(2))。 - 页面结构可能随时间变化,如果上述选择器失效,直接用浏览器F12开发者工具看最新元素结构,调整选择器就行。
内容的提问来源于stack exchange,提问作者Christina
相关产品推荐
相关产品推荐

