网页爬取中如何实现页码自动切换?
自动爬取静态网站所有分页内容(无需预设页码)
核心思路
通过循环尝试爬取页码,直到某一页没有返回有效产品数据(或请求失败)时停止,无需预先知晓目标板块的总页码数。
修改后的完整代码
library(rvest) library(tidyverse) base_url <- "https://morskidar.bg/products.php?category=pryasna-riba&page=%d" scrape_prices <- function(page) { url <- sprintf(base_url, page) # 捕获请求错误,避免程序直接崩溃 page_content <- possibly(read_html, otherwise = NULL)(url) if (is.null(page_content)) { return(tibble()) # 返回空数据框标记该页无效 } product_elements <- page_content %>% html_elements(".col-sm-6") # 若当前页无产品元素,直接返回空数据框 if (length(product_elements) == 0) { return(tibble()) } pc <- product_elements %>% map_dfr(~ tibble( product = .x %>% html_element(".shop-three-products-name a") %>% html_text2(), price = .x %>% html_element(".shop-three-products-price") %>% html_text2() )) %>% mutate(date = Sys.Date(), location = "Unknown", type = "Unknown", source = "Unknown", .before = product) %>% separate_wider_delim(price, delim = " - ", names = c("unit", "price")) %>% mutate(price = parse_number(price), unit = str_remove(unit, "\\.")) %>% distinct() return(pc) } # 自动遍历所有有效页码 scrape_all_pages <- function() { page_num <- 1 all_data <- list() while(TRUE) { current_data <- scrape_prices(page_num) # 当当前页无数据时,终止循环 if (nrow(current_data) == 0) { break } all_data[[page_num]] <- current_data page_num <- page_num + 1 # 可选:添加请求延迟,降低被反爬拦截的概率 Sys.sleep(1) } bind_rows(all_data) } final_df <- scrape_all_pages()
关键调整说明
- 给
read_html包裹possibly函数,捕获页面请求失败的情况,避免程序崩溃 - 新增判断逻辑:若当前页没有产品元素(
.col-sm-6),直接返回空数据框 - 新增
scrape_all_pages函数,通过while循环从页码1开始爬取,直到遇到空数据页时停止 - 可选添加
Sys.sleep(1),给请求增加1秒延迟,适配网站的反爬规则
内容的提问来源于stack exchange,提问作者NickD
相关产品推荐
相关产品推荐

