You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页爬取中如何实现页码自动切换?

自动爬取静态网站所有分页内容(无需预设页码)

核心思路

通过循环尝试爬取页码,直到某一页没有返回有效产品数据(或请求失败)时停止,无需预先知晓目标板块的总页码数。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:31:06