修复用于提取不同URL对应亚马逊商品评论的For循环错误
错误原因分析
- 动态变量赋值语法错误:无法直接将
paste0("page_", range)放在赋值符左侧生成变量,R不支持该写法,需要用assign()函数实现动态变量名创建。同时你这里调用了整个range向量,而非当前循环对应的单个页码,会触发长度不匹配报错。 - 页码赋值错误:代码中给
page字段赋值为paste0("a", i),既没有对应实际页码,还多加了无意义的前缀a。 - 补充:亚马逊有反爬机制,建议加上异常捕获逻辑,避免某页请求失败直接中断整个循环。
修正后可运行代码
和你原需求一致,生成单独page_xx格式的变量:
library(tidyr) library(rvest) # 不要用range做变量名,R内置有range()函数,容易冲突 page_range <- 12:82 # 批量生成所有页的URL url_list <- paste0("https://www.amazon.it/Philips-HD9260-90-Airfryer-plastica/product-reviews/B07WTHVQZH/ref=cm_cr_getr_d_paging_btm_next_", page_range ,"?ie=UTF8&reviewerType=all_reviews&pageNumber=", page_range) for (i in seq_along(url_list)) { # 异常捕获,单页爬取失败不中断整体循环 tryCatch({ doc <- read_html(url_list[i]) # 提取评论标题 review_title <- doc %>% html_nodes("[class='a-size-base a-link-normal review-title a-color-base review-title-content a-text-bold']") %>% html_text() # 提取评论正文 review_text <- doc %>% html_nodes("[class='a-size-base review-text review-text-content']") %>% html_text() # 提取评论星级 review_star <- doc %>% html_nodes("[data-hook='review-star-rating']") %>% html_text() # 动态生成对应页码的tibble变量 current_page <- page_range[i] assign(paste0("page_", current_page), tibble(review_title, review_text, review_star, page = current_page)) }, error = function(e) { message(paste0("第", page_range[i], "页爬取失败,错误信息:", e$message)) }) }
更优方案:直接合并为单张总表
不需要生成几十个分散的变量,直接把所有页结果存在一个总tibble里,后续清洗分析更方便:
library(tidyr) library(rvest) library(purrr) page_range <- 12:82 url_list <- paste0("https://www.amazon.it/Philips-HD9260-90-Airfryer-plastica/product-reviews/B07WTHVQZH/ref=cm_cr_getr_d_paging_btm_next_", page_range ,"?ie=UTF8&reviewerType=all_reviews&pageNumber=", page_range) # 定义单页爬取函数 scrape_single_page <- function(url, page_num) { tryCatch({ doc <- read_html(url) review_title <- doc %>% html_nodes("[class='a-size-base a-link-normal review-title a-color-base review-title-content a-text-bold']") %>% html_text() review_text <- doc %>% html_nodes("[class='a-size-base review-text review-text-content']") %>% html_text() review_star <- doc %>% html_nodes("[data-hook='review-star-rating']") %>% html_text() return(tibble(review_title, review_text, review_star, page = page_num)) }, error = function(e) { message(paste0("第", page_num, "页爬取失败:", e$message)) return(tibble()) }) } # 批量爬取并按行合并为总表 all_reviews <- map2_dfr(url_list, page_range, scrape_single_page)
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

