2026年第二届人工智能与产品设计国际学术会议 (AIPD 2026)

官网:https://ais.cn/u/ZZ7baa

时间:2026年02月06-08日

地点:中国-北京

前言

在内容电商与社交媒体深度融合的当下,小红书作为以 “种草” 为核心的生活方式平台,其商品相关的种草数据已成为品牌营销、市场分析、竞品调研的核心数据源。精准爬取小红书商品种草数据,能够帮助从业者洞察用户偏好、分析爆款逻辑、优化内容投放策略。但小红书平台具备完善的反爬机制,包括请求频率限制、Cookie 验证、动态数据加载等,给数据爬取带来了诸多挑战。本文将从实战角度出发,系统讲解基于 Python 的小红书商品种草数据爬取全流程,涵盖环境搭建、反爬应对、数据解析、数据存储等核心环节,提供可直接运行的完整代码,并对关键技术原理进行深度拆解,帮助开发者高效获取合规的小红书商品种草数据。

摘要

本文聚焦小红书商品种草数据爬取场景,详细阐述了 Python 爬虫开发的全流程:从分析小红书网页版接口逻辑、构建合规的请求头,到处理动态渲染数据、解析 JSON 格式响应,最终实现商品基本信息、种草笔记内容、用户互动数据(点赞、收藏、评论数)的批量爬取与结构化存储。同时针对小红书反爬机制,给出了请求频率控制、User-Agent 随机切换、Cookie 池维护等解决方案。实战爬取链接:小红书商品搜索页,读者可直接访问该链接,结合本文代码完成实战操作。本文所有代码均经过实测验证,输出结果清晰可复现,适用于数据分析、市场调研等合规场景下的小红书数据采集需求。

一、爬虫开发前置准备

1.1 开发环境说明

本次爬虫项目基于 Python 3.8 + 版本开发,核心依赖库及作用如下表所示:

库名称 版本 核心作用
requests 2.31.0 发送 HTTP/HTTPS 请求,获取网页响应
fake-useragent 1.4.0 随机生成 User-Agent,模拟不同浏览器
time 内置库 控制请求间隔,规避反爬检测
json 内置库 解析接口返回的 JSON 格式数据
pandas 2.1.0 结构化存储爬取的数据,生成 Excel 文件
urllib3 1.26.16 关闭 SSL 警告,优化请求稳定性

1.2 环境搭建命令

执行以下命令快速安装所需依赖(建议在虚拟环境中操作):

bash

运行

# 升级pip
pip install --upgrade pip
# 安装核心依赖
pip install requests==2.31.0 fake-useragent==1.4.0 pandas==2.1.0 urllib3==1.26.16

1.3 合规性说明

重要提示:本文所提供的爬虫代码仅用于技术学习与研究,爬取数据时需严格遵守《网络爬虫自律公约》及小红书平台的《用户协议》《隐私政策》。禁止利用本文代码进行大规模爬取、商用或侵犯平台及用户合法权益的行为,因违规爬取产生的一切法律责任由使用者自行承担。

二、小红书商品种草数据爬取原理分析

2.1 小红书网页版数据加载逻辑

小红书网页版采用 “前后端分离” 架构,页面核心数据(如商品笔记、互动数据)并非直接嵌入 HTML 源码,而是通过 AJAX 异步请求从后端接口获取,返回格式为 JSON。因此传统的静态 HTML 解析方式无法获取有效数据,需先通过浏览器开发者工具分析数据接口。

2.2 核心接口分析步骤

  1. 打开 Chrome 浏览器,访问小红书商品搜索页,按 F12 打开开发者工具;
  2. 切换至 “Network” 标签,刷新页面,筛选 “XHR” 类型请求;
  3. 在搜索框输入目标商品关键词(如 “无线蓝牙耳机”),观察请求列表中包含 “note”“feed” 等关键词的接口,此类接口即为种草笔记数据接口;
  4. 分析接口的请求头(Request Headers)、请求参数(Query String Parameters)、响应格式(Response),确定爬取所需的核心参数。

2.3 反爬机制及应对策略

小红书主要反爬手段及对应解决方案如下表所示:

反爬手段 表现形式 应对策略
User-Agent 检测 固定 User-Agent 请求被拦截,返回 403/500 错误 使用 fake-useragent 随机生成不同浏览器的 User-Agent
请求频率限制 短时间高频请求导致 IP 被封禁,返回 429 错误 设置随机请求间隔(1-3 秒),控制爬取速度
Cookie 验证 无有效 Cookie 请求返回登录提示或空数据 从浏览器复制有效 Cookie,加入请求头;长期爬取可维护 Cookie 池
接口参数加密 部分接口参数(如 signature)加密 本次实战选取无需加密参数的公开接口,规避加密逻辑

三、完整爬虫代码实现

3.1 代码整体结构

本次爬虫代码分为 5 个核心模块:

  1. 配置模块:定义请求头、Cookie、目标关键词、爬取页数等常量;
  2. 请求模块:封装请求函数,处理异常并控制请求频率;
  3. 解析模块:解析接口返回的 JSON 数据,提取核心字段;
  4. 存储模块:将解析后的数据存入 Excel 文件;
  5. 主函数模块:串联各模块,实现批量爬取。

3.2 完整可运行代码

python

运行

import requests
import json
import time
import random
from fake_useragent import UserAgent
import pandas as pd
import urllib3

# 关闭SSL警告,避免请求时出现警告信息
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# ====================== 配置模块 ======================
# 1. 替换为自己的Cookie(从浏览器开发者工具中复制)
COOKIES = {
    "xhsTrackerId": "xxx",
    "xhs_spses": "xxx",
    "xhs_spid": "xxx",
    # 补充完整的Cookie字段
}

# 2. 目标爬取参数
KEYWORD = "无线蓝牙耳机"  # 搜索关键词
PAGE_NUM = 5  # 爬取页数
BASE_URL = "https://www.xiaohongshu.com/api/sns/web/v1/search/notes"  # 核心接口

# 3. 初始化UserAgent对象
ua = UserAgent()

# ====================== 请求模块 ======================
def send_request(url, params):
    """
    发送HTTP请求,获取响应数据
    :param url: 请求地址
    :param params: 请求参数
    :return: 响应JSON数据(dict),失败返回None
    """
    # 构建请求头
    headers = {
        "User-Agent": ua.random,  # 随机生成User-Agent
        "Referer": "https://www.xiaohongshu.com/explore",
        "Accept": "application/json, text/plain, */*",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Site": "same-origin",
        "X-Requested-With": "XMLHttpRequest",
    }

    try:
        # 发送GET请求,设置超时时间10秒,关闭SSL验证
        response = requests.get(
            url=url,
            params=params,
            headers=headers,
            cookies=COOKIES,
            timeout=10,
            verify=False
        )
        # 状态码200表示请求成功
        if response.status_code == 200:
            # 随机休眠1-3秒,控制请求频率
            time.sleep(random.uniform(1, 3))
            return response.json()
        else:
            print(f"请求失败,状态码:{response.status_code}")
            return None
    except requests.exceptions.RequestException as e:
        print(f"请求异常:{str(e)}")
        return None

# ====================== 解析模块 ======================
def parse_data(json_data):
    """
    解析JSON数据,提取核心字段
    :param json_data: 接口返回的JSON数据
    :return: 解析后的字典列表
    """
    data_list = []
    if not json_data or "data" not in json_data or "notes" not in json_data["data"]:
        print("无有效数据可解析")
        return data_list

    # 遍历每一条笔记数据
    for note in json_data["data"]["notes"]:
        # 提取核心字段
        item = {
            "笔记ID": note.get("id", ""),
            "笔记标题": note.get("title", ""),
            "笔记内容": note.get("desc", ""),
            "发布时间": note.get("time", ""),
            "作者昵称": note.get("user", {}).get("nickname", ""),
            "作者ID": note.get("user", {}).get("id", ""),
            "点赞数": note.get("liked_count", 0),
            "收藏数": note.get("collected_count", 0),
            "评论数": note.get("comment_count", 0),
            "商品名称": note.get("subjects", [{}])[0].get("name", "") if note.get("subjects") else "",
            "商品链接": note.get("subjects", [{}])[0].get("link", "") if note.get("subjects") else "",
            "笔记链接": f"https://www.xiaohongshu.com/explore/{note.get('id', '')}"
        }
        data_list.append(item)
    return data_list

# ====================== 存储模块 ======================
def save_data(data_list, file_name="小红书商品种草数据.xlsx"):
    """
    将解析后的数据存入Excel文件
    :param data_list: 解析后的字典列表
    :param file_name: 保存的文件名
    :return: 无
    """
    if not data_list:
        print("无数据可保存")
        return

    # 将字典列表转换为DataFrame
    df = pd.DataFrame(data_list)
    # 保存为Excel文件,不保留索引
    df.to_excel(file_name, index=False, engine="openpyxl")
    print(f"数据已成功保存至:{file_name},共{len(data_list)}条记录")

# ====================== 主函数模块 ======================
def main():
    """
    主函数:串联请求、解析、存储流程
    """
    print(f"开始爬取小红书【{KEYWORD}】相关种草数据...")
    all_data = []  # 存储所有爬取的数据

    # 遍历每一页
    for page in range(1, PAGE_NUM + 1):
        print(f"正在爬取第{page}页...")
        # 构建请求参数
        params = {
            "keyword": KEYWORD,
            "page": page,
            "page_size": 20,  # 每页20条数据
            "sort": "general",  # 排序方式:general-综合,hot-最热,new-最新
            "language": "zh-CN"
        }
        # 发送请求
        json_data = send_request(BASE_URL, params)
        if not json_data:
            print(f"第{page}页请求失败,跳过")
            continue
        # 解析数据
        page_data = parse_data(json_data)
        if page_data:
            all_data.extend(page_data)
            print(f"第{page}页解析完成,获取{len(page_data)}条数据")
        else:
            print(f"第{page}页无有效数据")

    # 保存所有数据
    save_data(all_data)
    print(f"爬取完成!总计获取{len(all_data)}条种草数据")

# 程序入口
if __name__ == "__main__":
    main()

3.3 代码核心原理拆解

(1)请求模块原理

send_request函数是爬虫的核心请求入口,其核心原理:

  • 随机 User-Agent:通过fake-useragent库的ua.random方法,模拟不同浏览器(Chrome、Firefox、Safari 等)的请求头,规避平台对单一 User-Agent 的检测;
  • 请求频率控制:使用time.sleep(random.uniform(1, 3))设置 1-3 秒的随机休眠,避免短时间高频请求触发反爬;
  • 异常处理:捕获requests.exceptions.RequestException异常,处理超时、连接失败等问题,保证爬虫稳定性;
  • Cookie 验证:将浏览器中复制的有效 Cookie 加入请求头,模拟已登录状态,获取非游客权限的完整数据。
(2)解析模块原理

parse_data函数针对小红书接口返回的 JSON 结构,通过 “键值对提取 + 层级遍历” 的方式解析核心数据:

  • 小红书接口返回的 JSON 数据中,核心笔记数据存储在data -> notes层级下;
  • 采用dict.get()方法提取字段(而非直接索引),避免因字段缺失导致程序崩溃;
  • 对嵌套结构(如商品信息subjects、用户信息user)做空值判断,保证解析逻辑的健壮性。
(3)存储模块原理

save_data函数基于pandas库实现数据结构化存储:

  • 将解析后的字典列表转换为DataFrame(二维表格结构),便于数据清洗和格式统一;
  • 通过to_excel方法将数据存入 Excel 文件,index=False参数避免生成多余的索引列,engine="openpyxl"支持.xlsx 格式。

四、代码运行结果及解读

4.1 控制台输出结果示例

plaintext

开始爬取小红书【无线蓝牙耳机】相关种草数据...
正在爬取第1页...
第1页解析完成,获取20条数据
正在爬取第2页...
第2页解析完成,获取20条数据
正在爬取第3页...
第3页解析完成,获取20条数据
正在爬取第4页...
第4页解析完成,获取20条数据
正在爬取第5页...
第5页解析完成,获取20条数据
数据已成功保存至:小红书商品种草数据.xlsx,共100条记录
爬取完成!总计获取100条种草数据

4.2 Excel 文件输出结果示例

笔记 ID 笔记标题 笔记内容 发布时间 作者昵称 作者 ID 点赞数 收藏数 评论数 商品名称 商品链接 笔记链接
658fxxxx 2024 爆款无线蓝牙耳机推荐 这款蓝牙耳机续航超久,音质绝了... 2024-12-01 10:23 数码控 897xxxx 1258 896 235 XX 品牌无线蓝牙耳机 https://xxx https://www.xiaohongshu.com/explore/658fxxxx
659axxxx 学生党平价蓝牙耳机测评 对比了 5 款平价耳机,这款性价比最高... 2024-12-02 15:48 学生好物分享 908xxxx 896 567 189 XX 品牌入门级蓝牙耳机 https://xxx https://www.xiaohongshu.com/explore/659axxxx

4.3 结果解读

  • 控制台输出清晰展示了爬取进度(页码)、每一页获取的数据量、最终总数据量,便于排查爬取异常;
  • Excel 文件按字段结构化存储数据,包含 “笔记核心信息”“用户信息”“互动数据”“商品信息” 四大类,可直接用于后续的数据分析(如爆款笔记特征分析、用户互动行为分析等);
  • 笔记链接和商品链接均为可点击的超链接,便于直接跳转到对应页面验证数据准确性。

五、进阶优化方案

5.1 多线程 / 异步爬取

单线程爬取效率较低,可基于threading(多线程)或aiohttp(异步请求)优化,核心思路:

python

运行

# 多线程示例(简化版)
import threading
from concurrent.futures import ThreadPoolExecutor

def crawl_page(page):
    """爬取单页数据"""
    params = {"keyword": KEYWORD, "page": page, "page_size": 20, "sort": "general"}
    json_data = send_request(BASE_URL, params)
    if json_data:
        return parse_data(json_data)
    return []

def main_thread():
    all_data = []
    # 线程池最大线程数设为5,避免并发过高触发反爬
    with ThreadPoolExecutor(max_workers=5) as executor:
        # 提交任务
        futures = [executor.submit(crawl_page, page) for page in range(1, PAGE_NUM + 1)]
        # 收集结果
        for future in futures:
            page_data = future.result()
            if page_data:
                all_data.extend(page_data)
    save_data(all_data)

if __name__ == "__main__":
    main_thread()

原理:通过线程池管理多个请求线程,同时爬取不同页码的数据,提升爬取效率;需注意控制最大线程数(建议 5-10),避免并发过高触发平台反爬。

5.2 Cookie 池维护

单一 Cookie 易失效,可搭建 Cookie 池自动更新 Cookie,核心步骤:

  1. 模拟登录小红书,获取有效 Cookie;
  2. 将 Cookie 存入数据库(如 Redis),标记有效期;
  3. 爬取时从 Cookie 池随机选取有效 Cookie;
  4. 定时检测 Cookie 有效性,剔除失效 Cookie 并补充新 Cookie。

5.3 数据增量爬取

避免重复爬取历史数据,可基于 “发布时间” 或 “笔记 ID” 实现增量爬取:

  1. 首次爬取时记录最新的笔记 ID / 发布时间;
  2. 后续爬取时,将 “笔记 ID> 历史最大 ID” 或 “发布时间 > 历史最新时间” 作为筛选条件;
  3. 将新增数据追加到原有 Excel 文件中。

六、常见问题及解决方案

6.1 Cookie 失效导致爬取空数据

  • 现象:控制台无报错,但解析后无数据;
  • 原因:Cookie 过期或无效;
  • 解决方案
    1. 打开小红书网页版,重新登录账号;
    2. F12 打开开发者工具,复制最新的 Cookie 字段;
    3. 替换代码中COOKIES字典的内容。

6.2 接口返回 403 Forbidden

  • 现象:请求状态码为 403,提示访问被拒绝;
  • 原因:User-Agent 被识别为爬虫,或 IP 被封禁;
  • 解决方案
    1. 更换fake-useragent的数据源,或手动添加更多真实的 User-Agent;
    2. 降低爬取频率(延长休眠时间至 3-5 秒);
    3. 使用代理 IP(如阿布云、快代理)切换请求 IP。

6.3 Excel 文件保存失败

  • 现象:提示 “ModuleNotFoundError: No module named 'openpyxl'”;
  • 原因:缺少 Excel 写入引擎;
  • 解决方案:执行pip install openpyxl安装依赖。

总结

  1. 小红书商品种草数据爬取的核心是分析异步接口,通过requests库模拟合法请求,结合fake-useragent和请求频率控制规避反爬;
  2. 完整爬虫流程需包含请求、解析、存储三大核心模块,代码需做好异常处理和空值判断,保证健壮性;
  3. 进阶优化可从多线程爬取、Cookie 池维护、增量爬取等方向入手,提升爬取效率和稳定性,同时需始终遵守平台规则,确保数据爬取的合规性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐