在小红书电商生态中,商品笔记与购物车数据是分析用户行为、优化投放策略的核心依据。然而,平台严格的反爬机制与动态数据加载方式,使得数据采集面临技术挑战。本文将从技术原理、工具选择、实战案例三个维度,解析如何合法高效地获取商品链接与购物车信息。
一、小红书数据采集的技术壁垒
小红书的数据呈现呈现三大特征:动态渲染、接口加密、权限分级。商品笔记的展示依赖JavaScript动态加载,传统HTTP请求库(如requests)仅能获取空框架;购物车数据则通过用户登录态下的私有接口返回,需携带签名参数与加密令牌。此外,平台对高频请求实施IP封禁、验证码拦截等风控策略,进一步提升了采集难度。
以商品笔记链接为例,其URL结构通常为`https://www.xiaohongshu.com/explore/{note_id}`,其中`note_id`是笔记的唯一标识。但直接请求该URL仅能获取基础HTML,商品详情、价格等关键字段需通过调用`/api/sns/v1/note/{note_id}`接口获取,且接口返回的JSON数据包含多层嵌套的加密字段。
二、核心数据采集技术路径
#1. 商品链接采集:接口逆向与动态渲染双轨并行
路径一:接口逆向工程
通过浏览器开发者工具(F12)抓取网络请求,定位商品数据接口。例如,搜索商品时,平台会调用`/api/sns/v1/search/notes`接口,参数包含`keyword`(搜索词)、`page`(页码)等。需注意:
- 请求头伪装:需携带`User-Agent`、`Cookie`、`X-S-USER-ID`等字段,模拟真实用户行为。
- 签名算法破解:部分接口参数(如`xsec_token`)需通过逆向JavaScript代码生成,可使用PyExecJS库执行前端逻辑。
- 分页控制:小红书采用滚动加载,需模拟滚动事件触发数据分页,或直接解析`max_id`参数实现增量采集。
路径二:动态渲染解析
对于高度依赖JS渲染的页面(如用户主页),可使用Playwright或Selenium实现无头浏览器自动化。以Playwright为例:
```python
from playwright.sync_api import sync_playwright
def get_note_links(user_url):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(user_url)
滚动加载全部笔记
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
提取链接
note_links = page.query_selector_all_text("a[href*='/explore/']")
browser.close()
return note_links
```
#2. 购物车信息采集:用户态模拟与数据脱敏
购物车数据属于用户隐私范畴,采集需严格遵守平台规则。合法路径包括:
- 官方开放API:小红书提供`/api/sns/v1/cart/items`接口,但需企业级账号授权,且返回字段有限。
- 模拟用户操作:通过自动化工具登录账号,进入购物车页面提取数据。需注意:
- 登录态维护:使用`web_session`、`webId`等Cookie字段保持会话。
- 数据脱敏:避免采集用户ID、手机号等敏感信息,聚焦商品SKU、价格等公开字段。
三、高效采集工具链推荐
#1. 专用爬虫库:xhs
xhs是专为小红书设计的Python爬虫库,封装了接口签名、反爬绕过等逻辑。示例代码:
```python
from xhs import XhsClient
client = XhsClient(cookie="your_cookie_here")
搜索商品笔记
results = client.search_note(keyword="美妆", sort_type="hot")
for item in results["items"]:
print(f"笔记ID: {item['note_id']}, 商品链接: {item['items'][0]['url']}")
```
#2. 通用爬虫框架:Scrapy + Splash
对于复杂页面,可结合Scrapy与Splash(基于WebKit的渲染服务):
```python
scrapy_splash_example.py
import scrapy
from scrapy_splash import SplashRequest
class NoteSpider(scrapy.Spider):
name = "note_spider"
start_urls = ["https://www.xiaohongshu.com/user/profile/123456"
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(
url,
args={"wait": 3}, 等待JS加载
endpoint="render.html",
callback=self.parse
)
def parse(self, response):
note_links = response.css("a[href*='/explore/']::attr(href)").getall()
yield {"note_links": note_links}
```
四、合规性与风险控制
1. 频率限制:单IP请求间隔建议≥3秒,避免触发风控。
2. 代理IP池:使用高匿代理(如BrightData、ScraperAPI)分散请求源。
3. User-Agent轮换:随机切换浏览器标识,降低被识别概率。
4. 数据用途声明:采集数据仅用于内部分析,不得用于商业竞争或用户画像。
五、实战案例:某美妆品牌商品笔记分析
目标:采集“口红”相关笔记的商品链接、价格及互动数据。
步骤:
1. 使用xhs库搜索关键词,获取笔记ID列表。
2. 调用笔记详情接口,提取商品信息。
3. 存储至MongoDB,按点赞数排序分析爆款。
代码片段:
```python
from xhs import XhsClient
import pymongo
client = XhsClient(cookie="your_cookie_here")
db = pymongo.MongoClient()["xiaohongshu"
keyword = "口红"
results = client.search_note(keyword=keyword, page_size=50)
for note in results["items"]:
detail = client.get_note_by_id(note_id=note["note_id"])
if detail["items"]:
product = detail["items"][0
db.notes.insert_one({
"title": note["title"],
"product_url": product["url"],
"price": product["price"],
"likes": note["like_count"
})
```
结语
小红书数据采集需平衡技术效率与合规风险。通过接口逆向、动态渲染解析与专用工具链,可实现商品链接与购物车信息的高效获取。但务必遵守平台规则,避免法律纠纷。对于大规模商业采集,建议优先申请小红书开放平台权限,或使用官方数据服务。