R中purrr::map配合polite爬取多页仅重复返回第一页问题
错误原因
代码重复返回第一页结果,是两处传参逻辑错误导致的:
- 对
polite包的scrape()函数参数理解有误:你提前把分页参数拼接到了obr_polite_pg向量的URL中,但调用scrape()时传入的query = list(i = .x)是无效参数——站点识别分页的查询字段是page,不是i,而且你把完整URL作为i的参数值传递,根本不会被站点识别。 scrape()默认基于bow()初始化时传入的基础URL发起请求,错误的query参数不会覆盖基础请求地址,最终所有请求都落到了无分页参数的第一页地址上。
修正代码
两种实现方式二选一即可:
方式一:使用预构造的完整分页URL
library(magrittr) library(rvest) library(polite) library(purrr) # 分页URL构造逻辑正确,可直接使用 obr_polite_pg <- paste0("https://onebite.app/reviews/fans?page=", seq(1:3), "&minScore=0&maxScore=10") session <- bow("https://www.onebite.app/reviews/fans", force = TRUE, user_agent = "matthewramsdell@icloud.com") # 直接通过url参数传入目标分页地址,移除错误的query传参 obr_responses <- map(obr_polite_pg, ~scrape(session, url = .x)) obr_rctitle <- map(obr_responses, ~html_elements(.x, ".reviewCard__title") %>% html_text())
方式二:通过query参数传递分页规则
不需要提前拼接URL,直接在scrape()中传入和站点匹配的查询参数即可:
library(magrittr) library(rvest) library(polite) library(purrr) session <- bow("https://www.onebite.app/reviews/fans", force = TRUE, user_agent = "matthewramsdell@icloud.com") # 遍历页码,query参数名严格和站点要求的字段名对应 obr_responses <- map(1:3, ~scrape(session, query = list( page = .x, minScore = 0, maxScore = 10 ))) obr_rctitle <- map(obr_responses, ~html_elements(.x, ".reviewCard__title") %>% html_text())
注意:爬取时请遵守目标站点的robots协议,控制请求间隔,避免对站点服务造成压力。
内容的提问来源于stack exchange,提问作者mjrams73
相关产品推荐
相关产品推荐

