如何爬取无分页标识的滚动加载网站全部商品?附现有代码
解决滚动加载商品的爬虫方案
你爬取的网站采用滚动加载动态获取商品,静态请求只能拿到初始24个,需要调用网站的商品数据API来循环获取所有商品,具体方案如下:
核心思路
- 定位数据接口:通过浏览器开发者工具(F12)的Network标签,滚动页面时观察XHR请求,找到返回商品列表的API接口。目标网站的商品数据接口为
https://en-saudi.ounass.com/api/catalog/products,参数包含分类路径、页码、每页数量等。 - 循环请求接口:从第1页开始,每次递增页码,直到接口返回的商品列表为空,停止循环。
- 解析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,提问作者أسامة القحطاني
相关产品推荐
相关产品推荐

