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

如何爬取无分页标识的滚动加载网站全部商品?附现有代码

解决滚动加载商品的爬虫方案

你爬取的网站采用滚动加载动态获取商品,静态请求只能拿到初始24个,需要调用网站的商品数据API来循环获取所有商品,具体方案如下:

核心思路

  1. 定位数据接口:通过浏览器开发者工具(F12)的Network标签,滚动页面时观察XHR请求,找到返回商品列表的API接口。目标网站的商品数据接口为https://en-saudi.ounass.com/api/catalog/products,参数包含分类路径、页码、每页数量等。
  2. 循环请求接口:从第1页开始,每次递增页码,直到接口返回的商品列表为空,停止循环。
  3. 解析JSON数据:直接提取返回JSON中的商品字段,无需解析HTML,效率更高。

修改后的爬虫代码

import requests
import pandas as pd
from time import sleep

# 初始化存储列表
product_name = []
product_brand = []
product_price = []
product_img = []
relative_url = []

# 基础API地址和参数
api_url = "https://en-saudi.ounass.com/api/catalog/products"
params = {
    "category": "women/beauty/fragrance",
    "page": 1,
    "pageSize": 24,
    "sort": "popularity"  # 可根据需求调整排序方式(如price-desc、price-asc)
}

# 请求头,模拟浏览器访问,降低反爬拦截概率
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Referer": "https://en-saudi.ounass.com/women/beauty/fragrance"
}

while True:
    try:
        # 发送API请求
        response = requests.get(api_url, params=params, headers=headers)
        response.raise_for_status()  # 检查请求是否成功,失败则抛出异常
        data = response.json()
        
        # 获取商品列表,若为空则退出循环(已爬完所有商品)
        products = data.get("data", {}).get("products", [])
        if not products:
            break
        
        # 遍历商品,提取所需字段
        for product in products:
            product_name.append(product.get("name", "n/a"))
            product_brand.append(product.get("brand", {}).get("name", "n/a"))
            product_price.append(product.get("minPrice", {}).get("value", "n/a"))
            # 取第一张商品图片
            img_url = product.get("images", [{}])[0].get("url", "n/a")
            product_img.append(img_url)
            relative_url.append(product.get("url", "n/a"))
        
        # 页码递增,准备下一页请求
        params["page"] += 1
        # 休眠1秒,避免请求过于频繁触发反爬
        sleep(1)
        
    except Exception as e:
        print(f"请求出错: {e}")
        break

# 将数据转换为DataFrame并保存为CSV
df = pd.DataFrame({
    "品牌": product_brand,
    "商品名称": product_name,
    "价格": product_price,
    "图片链接": product_img,
    "商品链接": relative_url
})

df.to_csv("ounass香水商品数据.csv", index=False, encoding="utf-8-sig")
print(f"爬取完成,共获取{len(df)}个商品数据")

代码要点说明

  • API请求:直接调用网站的商品数据接口,比解析静态HTML更高效,且能获取所有动态加载的商品。
  • 循环终止条件:当接口返回的商品列表为空时,说明已爬完所有商品,停止循环。
  • 反爬规避:添加User-Agent和Referer模拟浏览器访问,每次请求后休眠1秒,降低被拦截的概率。
  • 异常处理:捕获请求过程中的异常,避免程序意外崩溃。

内容的提问来源于stack exchange,提问作者أسامة القحطاني

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:10:24