前言
小红书作为国内知名的社交电商平台,拥有丰富的商品数据和用户评价信息。对于数据分析师、产品经理或电商从业者来说,能够获取小红书的商品数据具有重要的商业价值。本文将详细介绍如何通过逆向工程实现小红书商品搜索API的调用。
免责声明:本文仅用于技术学习和研究目的,请遵守相关法律法规和平台服务条款,不得用于商业用途或恶意爬取。
技术架构概览
本项目主要包含以下核心功能:
- 商品搜索功能
- 商品详情获取
- 商家在线状态查询
- 请求签名生成
- 反爬虫参数构造
主要技术栈
- Python 3.x
- requests 库(HTTP请求)
- loguru 库(日志管理)
- 自定义加密算法
核心组件分析
1. 请求头参数构造
小红书的API需要多个关键参数来绕过反爬虫机制:
def xb3():"""生成X-B3-TraceId"""characters = "abcdef0123456789"return ''.join(random.choice(characters) for _ in range(16))def x_xray():"""生成X-Xray-Traceid"""atomic_integer = [random.randint(0, 2 ** 32 - 1)]j16 = int(time.time() * 1000)a16 = [(j16 << 23) | (get_and_increment(atomic_integer) & 8570985),next_long()]return f"{a16[0]:016x}{a16[1]:016x}"
关键参数说明:
X-B3-TraceId
: 16位随机十六进制字符串X-Xray-Traceid
: 基于时间戳和随机数生成的32位十六进制字符串shield
: 签名
2. Shield参数获取
Shield是小红书最关键的反爬虫参数,需要通过专门的服务来生成:
def get_shield(xhs_api_url, xy_common_params, deviceId, hmac):"""获取Shield参数"""shield_params = {'noteid': '','param': xy_common_params,'device': deviceId,'hmac': hmac,'url': xhs_api_url,'direction': '48'}body = urlencode(shield_params)headers = {}shield_url = ""response = requests.post(shield_url, data=body, headers=headers, timeout=5)return response.text.strip()
3. 设备指纹构造
小红书需要模拟真实的移动设备环境:
# 设备相关参数
deviceId = '换成自己的'
fid = '换成自己的'
smid = '换成自己的'# User-Agent模拟Android设备
need_ua = '换成自己的'
主要功能实现
1. 商品搜索功能
def search_xiaohongshu(page=1, keyword='ccd相机', sid=None):"""搜索小红书商品,支持翻页Args:page (int): 页码keyword (str): 搜索关键词sid (str): 会话IDReturns:dict: 商品搜索结果"""# 构造搜索参数xhs_params = {'keyword': keyword,'filters': '','page': page,'size': '20','sort': '','source': 'explore_feed','search_id': J(), # 生成唯一搜索ID'page_pos': 0,'store_id': '','geo': '','sku_list': '','note_list': '','allow_rewrite': 'true'}# 发送请求并返回结果response = requests.get(xhs_base_url, params=xhs_params, headers=xhs_headers, timeout=10)return response.json()
2. 商品详情获取
def get_product_detail(skuId, sid=None):"""获取商品详细信息"""base_url = "https://mall.xiaohongshu.com/api/store/jpd/edith/detail/primary"params = {"sku_id": skuId,"source": "mall_home","address_id": "","cart_key": "","pre_page": "mall_home","trade_ext": "","move_ahead_pic_id": ""}# 构造完整请求并返回结果response = requests.get(xhs_api_url, headers=xhs_headers, timeout=5)return response.json()
3. 商家状态查询
def get_seller_status(sellerId, sid):"""查询商家在线状态"""url = "https://www.xiaohongshu.com/api/edith/cs/seller/online/status"params = {"sellerId": sellerId,"sid": f"session.{sid}",}response = requests.get(url, headers=headers, params=params)return response.json()
参数配置详解
xy-common-params参数
这是小红书API中最重要的公共参数集合:
xy_common_params_dict = {'fid': fid, # 设备指纹ID'device_fingerprint': smid, # 设备指纹'device_fingerprint1': smid, # 设备指纹副本'cpu_name': 'Qualcomm Technologies, Inc SM8150', # CPU信息'gid': x_mini_gid, # 小程序GID'device_model': 'phone', # 设备类型'launch_id': '1748314107', # 启动ID'tz': 'Asia/Shanghai', # 时区'channel': 'Vivo', # 渠道'versionName': '8.84.0', # 版本名称'overseas_channel': '0', # 海外渠道'deviceId': deviceId, # 设备ID'platform': 'android', # 平台'sid': f'session.{sid}', # 会话ID'identifier_flag': '4', # 标识符标志't': '1748314126', # 时间戳'project_id': 'ECFAAF', # 项目ID'build': '8840940', # 构建号'x_trace_page_current': 'search_result_goods', # 当前页面'lang': 'zh-Hans', # 语言'app_id': 'ECFAAF01', # 应用ID'uis': 'light', # UI主题'teenager': '0' # 青少年模式
}
使用示例
if __name__ == "__main__":KEYWORD = 'ccd相机' # 搜索关键词skuid = '67df8608791e9400157c0328'sid = '1747021841033229293800'# 搜索商品search_data = search_xiaohongshu(1, keyword=KEYWORD, sid=sid)print("搜索结果:", search_data)# 获取商品详情detail_data = get_product_detail(skuid, sid)print("商品详情:", detail_data)# 查询商家状态seller_data = get_seller_status('67852ceaa78db60015df3130', sid)print("商家状态:", seller_data)
结果
技术难点与解决方案
1. 反爬虫机制
- 问题: 小红书有复杂的反爬虫机制
- 解决: 通过模拟真实设备环境和动态生成签名参数
2. 参数加密
- 问题: 多个参数需要特殊的加密算法
- 解决: 逆向分析并实现相应的加密函数
3. 请求频率控制
- 问题: 频繁请求可能被封禁
- 解决: 添加随机延时和请求间隔控制
注意事项与建议
1. 合规使用
- 严格遵守robots.txt协议
- 控制请求频率,避免对服务器造成压力
- 仅用于学习研究,不得商业使用
2. 参数维护
- 定期更新设备指纹和签名参数
- 监控API变化,及时调整代码
3. 错误处理
- 添加完善的异常处理机制
- 实现请求重试逻辑
- 记录详细的日志信息
总结
本文详细介绍了小红书商品搜索API的逆向工程实现过程,包括关键参数的构造、反爬虫机制的绕过以及核心功能的实现。通过这个项目,可以深入理解现代Web应用的反爬虫机制和相应的应对策略。
在实际使用中,请务必遵守相关法律法规和平台规则,将技术用于正当用途。同时,随着平台技术的不断升级,相关参数和接口可能会发生变化,需要持续维护和更新代码。
希望这篇文章能够帮助大家更好地理解Web爬虫技术和反爬虫机制,为后续的学习和研究提供参考。
相关资源:
- Python requests文档
- Web爬虫技术指南
- 反爬虫技术解析