【实战】Python 小红书商品种草数据爬取全解析(附完整可运行代码)
本文详细介绍了基于Python爬取小红书商品种草数据的完整流程。首先分析了小红书网页版的数据加载逻辑和反爬机制,提出了User-Agent随机切换、请求频率控制等应对策略。然后给出了包含配置、请求、解析、存储四大模块的完整代码实现,支持获取商品信息、种草笔记内容和用户互动数据。最后针对常见问题提供了解决方案,并建议通过多线程、Cookie池维护等技术进行优化。文章强调数据爬取需遵守平台规则,仅用于
2026年第二届人工智能与产品设计国际学术会议 (AIPD 2026)

时间: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 核心接口分析步骤
- 打开 Chrome 浏览器,访问小红书商品搜索页,按 F12 打开开发者工具;
- 切换至 “Network” 标签,刷新页面,筛选 “XHR” 类型请求;
- 在搜索框输入目标商品关键词(如 “无线蓝牙耳机”),观察请求列表中包含 “note”“feed” 等关键词的接口,此类接口即为种草笔记数据接口;
- 分析接口的请求头(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 个核心模块:
- 配置模块:定义请求头、Cookie、目标关键词、爬取页数等常量;
- 请求模块:封装请求函数,处理异常并控制请求频率;
- 解析模块:解析接口返回的 JSON 数据,提取核心字段;
- 存储模块:将解析后的数据存入 Excel 文件;
- 主函数模块:串联各模块,实现批量爬取。
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,核心步骤:
- 模拟登录小红书,获取有效 Cookie;
- 将 Cookie 存入数据库(如 Redis),标记有效期;
- 爬取时从 Cookie 池随机选取有效 Cookie;
- 定时检测 Cookie 有效性,剔除失效 Cookie 并补充新 Cookie。
5.3 数据增量爬取
避免重复爬取历史数据,可基于 “发布时间” 或 “笔记 ID” 实现增量爬取:
- 首次爬取时记录最新的笔记 ID / 发布时间;
- 后续爬取时,将 “笔记 ID> 历史最大 ID” 或 “发布时间 > 历史最新时间” 作为筛选条件;
- 将新增数据追加到原有 Excel 文件中。
六、常见问题及解决方案
6.1 Cookie 失效导致爬取空数据
- 现象:控制台无报错,但解析后无数据;
- 原因:Cookie 过期或无效;
- 解决方案:
- 打开小红书网页版,重新登录账号;
- F12 打开开发者工具,复制最新的 Cookie 字段;
- 替换代码中
COOKIES字典的内容。
6.2 接口返回 403 Forbidden
- 现象:请求状态码为 403,提示访问被拒绝;
- 原因:User-Agent 被识别为爬虫,或 IP 被封禁;
- 解决方案:
- 更换
fake-useragent的数据源,或手动添加更多真实的 User-Agent; - 降低爬取频率(延长休眠时间至 3-5 秒);
- 使用代理 IP(如阿布云、快代理)切换请求 IP。
- 更换
6.3 Excel 文件保存失败
- 现象:提示 “ModuleNotFoundError: No module named 'openpyxl'”;
- 原因:缺少 Excel 写入引擎;
- 解决方案:执行
pip install openpyxl安装依赖。
总结
- 小红书商品种草数据爬取的核心是分析异步接口,通过
requests库模拟合法请求,结合fake-useragent和请求频率控制规避反爬; - 完整爬虫流程需包含请求、解析、存储三大核心模块,代码需做好异常处理和空值判断,保证健壮性;
- 进阶优化可从多线程爬取、Cookie 池维护、增量爬取等方向入手,提升爬取效率和稳定性,同时需始终遵守平台规则,确保数据爬取的合规性。

更多推荐



所有评论(0)