小红书数据采集技术深度解析:从传统爬虫到现代API封装

小红书数据采集技术深度解析:从传统爬虫到现代API封装 小红书数据采集技术深度解析从传统爬虫到现代API封装【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs引言当数据需求遇上技术挑战在当今内容驱动的互联网时代小红书作为中国领先的生活方式分享平台积累了海量的用户生成内容。无论是市场分析师需要了解消费趋势还是内容创作者希望获取创作灵感亦或是研究人员进行社交网络分析都面临着同一个技术难题如何高效、稳定、合规地获取小红书平台的公开数据传统的数据采集方法通常面临三大困境平台反爬机制的不断升级导致采集脚本频繁失效直接调用未公开API存在法律和技术风险自行维护爬虫系统需要投入大量开发资源。这些问题使得许多团队在数据采集项目上举步维艰。技术方案全景传统与现代的对比分析传统爬虫方案的局限传统的小红书数据采集方案通常基于以下几种技术路径直接网页抓取使用requests库配合BeautifulSoup解析HTML面临动态渲染、JavaScript执行、反爬检测等挑战维护成本高平台UI变化即需重写解析逻辑Selenium自动化模拟真实浏览器行为绕过部分反爬资源消耗大难以规模化部署执行效率低下不适合批量采集逆向工程分析通过浏览器开发者工具分析API接口需要持续跟踪接口变化和签名算法更新技术门槛高普通开发者难以实现xhs库的现代解决方案xhs库采用了一种全新的技术架构将复杂的逆向工程工作封装成简洁的Python接口# 传统方案 vs xhs库对比 传统方案伪代码 1. 分析页面结构 - 编写解析器 2. 处理动态加载 - 集成Selenium 3. 绕过反爬机制 - 实现代理池、请求头轮换 4. 处理登录状态 - 维护Cookie池 xhs库方案 from xhs import XhsClient client XhsClient(cookieyour_cookie) note client.get_note_by_id(note_id)技术决策矩阵考量维度传统爬虫xhs库推荐选择开发复杂度高需处理反爬、解析、代理等低封装完整接口xhs库维护成本高需持续适配平台变化中库作者维护核心逻辑xhs库稳定性低易被检测封禁高模拟真实请求xhs库合规性风险高可能违反服务条款风险中使用公开接口需评估性能低HTML解析耗时高直接API调用xhs库功能完整性有限需自行实现完整覆盖主要功能xhs库核心突破签名机制的技术解密小红书的反爬体系分析小红书采用了多层次的防御机制其中最核心的是基于浏览器指纹和动态签名的验证体系环境检测识别请求是否来自真实浏览器行为分析监测请求频率和模式签名验证每个请求都需要携带动态生成的签名Cookie验证维持会话状态和用户身份xhs库的签名实现原理xhs库通过Playwright模拟真实浏览器环境调用小红书网页中的JavaScript签名函数实现了完美的请求模拟# 签名服务的核心逻辑 def sign(uri, dataNone, a1, web_session): 通过Playwright模拟浏览器环境获取签名 :param uri: 请求的URI :param data: 请求数据 :param a1: Cookie中的a1字段 :param web_session: 会话标识 :return: 包含x-s和x-t签名的字典 # 使用stealth.min.js绕过环境检测 # 调用window._webmsxyw函数生成签名 # 返回符合小红书要求的签名头签名服务架构设计┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 客户端请求 │ │ 签名服务 │ │ 小红书API │ │ │ │ │ │ │ │ 1. 构造原始请求 │───▶│ 2. 浏览器环境 │───▶│ 3. 签名验证 │ │ (无签名) │ │ 生成签名 │ │ 通过 │ │ │ │ │ │ │ │ 6. 接收响应数据 │◀───│ 5. 转发响应 │◀───│ 4. 返回数据 │ └─────────────────┘ └─────────────────┘ └─────────────────┘实战演练构建企业级数据采集系统环境部署与配置基础环境搭建# 1. 创建Python虚拟环境 python -m venv xhs-env source xhs-env/bin/activate # Linux/Mac # 或 xhs-env\Scripts\activate # Windows # 2. 安装xhs库及其依赖 pip install xhs playwright # 3. 安装浏览器环境 playwright install chromium # 4. 下载反检测脚本 curl -O https://cdn.jsdelivr.net/gh/requireCool/stealth.min.js/stealth.min.jsDocker容器化部署对于生产环境推荐使用Docker部署签名服务# Dockerfile示例 FROM python:3.9-slim WORKDIR /app # 安装系统依赖 RUN apt-get update apt-get install -y \ wget \ rm -rf /var/lib/apt/lists/* # 安装Python依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 安装Playwright和浏览器 RUN pip install playwright playwright install chromium # 下载反检测脚本 RUN wget https://cdn.jsdelivr.net/gh/requireCool/stealth.min.js/stealth.min.js # 复制应用代码 COPY . . # 暴露端口 EXPOSE 5005 # 启动服务 CMD [python, app.py]核心功能实现1. 客户端初始化与配置from xhs import XhsClient import logging class XhsDataCollector: def __init__(self, cookie, sign_service_urlNone): 初始化小红书数据采集器 Args: cookie: 小红书Cookie字符串 sign_service_url: 签名服务URL可选用于分布式部署 self.logger logging.getLogger(__name__) if sign_service_url: # 使用远程签名服务 self.client XhsClient( cookiecookie, signself._remote_sign(sign_service_url) ) else: # 使用本地签名 self.client XhsClient( cookiecookie, signself._local_sign ) def _local_sign(self, uri, dataNone, a1, web_session): 本地签名实现 # 实现本地签名逻辑 pass def _remote_sign(self, service_url): 远程签名服务调用 def sign_func(uri, dataNone, a1, web_session): import requests response requests.post( f{service_url}/sign, json{ uri: uri, data: data, a1: a1, web_session: web_session } ) return response.json() return sign_func2. 数据采集策略设计import time import random from datetime import datetime from typing import List, Dict, Optional class DataCollectionStrategy: 数据采集策略管理器 def __init__(self, collector: XhsDataCollector): self.collector collector self.request_history [] def smart_delay(self): 智能请求延迟模拟人类操作模式 # 基础延迟 base_delay random.uniform(1.5, 3.5) # 考虑历史请求频率 if len(self.request_history) 10: recent_requests self.request_history[-10:] avg_interval sum( (recent_requests[i1] - recent_requests[i]).total_seconds() for i in range(len(recent_requests)-1) ) / (len(recent_requests)-1) # 如果请求过于频繁增加延迟 if avg_interval 2: base_delay * 1.5 time.sleep(base_delay) self.request_history.append(datetime.now()) def exponential_backoff(self, attempt: int, max_attempts: int 3): 指数退避策略 if attempt max_attempts: raise Exception(f请求失败已达到最大重试次数{max_attempts}) delay (2 ** attempt) random.uniform(0, 1) time.sleep(delay) return delay def batch_collect(self, note_ids: List[str], batch_size: int 10): 批量采集笔记数据 results [] for i, note_id in enumerate(note_ids): try: # 应用智能延迟 self.smart_delay() # 采集数据 note_data self.collector.client.get_note_by_id(note_id) results.append(note_data) # 每batch_size个请求后休息更长时间 if (i 1) % batch_size 0: time.sleep(random.uniform(5, 10)) except Exception as e: self.logger.error(f采集笔记{note_id}失败: {e}) # 实现重试逻辑 for attempt in range(3): try: self.exponential_backoff(attempt) note_data self.collector.client.get_note_by_id(note_id) results.append(note_data) break except Exception as retry_error: if attempt 2: self.logger.error(f重试{attempt1}次后仍失败: {retry_error}) return results3. 数据存储与处理import sqlite3 import json from contextlib import contextmanager from dataclasses import dataclass from typing import Any dataclass class NoteData: 笔记数据结构化表示 note_id: str title: str desc: str user_id: str nickname: str like_count: int collect_count: int comment_count: int share_count: int tags: List[str] create_time: int update_time: int raw_data: Dict[str, Any] class DataStorageManager: 数据存储管理器 def __init__(self, db_path: str xhs_data.db): self.db_path db_path self._init_database() contextmanager def get_connection(self): 获取数据库连接上下文管理器 conn sqlite3.connect(self.db_path) try: yield conn finally: conn.close() def _init_database(self): 初始化数据库表结构 with self.get_connection() as conn: cursor conn.cursor() # 创建笔记表 cursor.execute( CREATE TABLE IF NOT EXISTS notes ( id TEXT PRIMARY KEY, title TEXT, description TEXT, user_id TEXT, nickname TEXT, like_count INTEGER DEFAULT 0, collect_count INTEGER DEFAULT 0, comment_count INTEGER DEFAULT 0, share_count INTEGER DEFAULT 0, tags TEXT, -- JSON数组格式 create_time INTEGER, update_time INTEGER, collected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, raw_data TEXT -- 原始JSON数据 ) ) # 创建用户表 cursor.execute( CREATE TABLE IF NOT EXISTS users ( user_id TEXT PRIMARY KEY, nickname TEXT, avatar TEXT, gender INTEGER, location TEXT, ip_location TEXT, red_id TEXT, desc TEXT, collected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) # 创建索引 cursor.execute(CREATE INDEX IF NOT EXISTS idx_notes_create_time ON notes(create_time)) cursor.execute(CREATE INDEX IF NOT EXISTS idx_notes_user_id ON notes(user_id)) cursor.execute(CREATE INDEX IF NOT EXISTS idx_notes_tags ON notes(tags)) conn.commit() def save_note(self, note_data: NoteData): 保存笔记数据 with self.get_connection() as conn: cursor conn.cursor() cursor.execute( INSERT OR REPLACE INTO notes (id, title, description, user_id, nickname, like_count, collect_count, comment_count, share_count, tags, create_time, update_time, raw_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , ( note_data.note_id, note_data.title, note_data.desc, note_data.user_id, note_data.nickname, note_data.like_count, note_data.collect_count, note_data.comment_count, note_data.share_count, json.dumps(note_data.tags, ensure_asciiFalse), note_data.create_time, note_data.update_time, json.dumps(note_data.raw_data, ensure_asciiFalse) )) conn.commit()4. 完整工作流示例import asyncio from concurrent.futures import ThreadPoolExecutor import pandas as pd class XhsDataPipeline: 小红书数据采集完整流水线 def __init__(self, cookie, max_workers3): self.collector XhsDataCollector(cookie) self.storage DataStorageManager() self.strategy DataCollectionStrategy(self.collector) self.executor ThreadPoolExecutor(max_workersmax_workers) def search_and_collect(self, keyword: str, pages: int 10): 搜索关键词并采集相关笔记 all_notes [] for page in range(1, pages 1): try: # 搜索笔记 search_results self.collector.client.search_note( keywordkeyword, pagepage, page_size20, sort_typehot # 可按热度、时间等排序 ) # 提取笔记ID note_ids [ item[id] for item in search_results.get(items, []) if id in item ] # 批量采集笔记详情 notes_data self.strategy.batch_collect(note_ids) # 处理并存储数据 for note_data in notes_data: note_obj self._parse_note_data(note_data) self.storage.save_note(note_obj) all_notes.append(note_obj) self.logger.info(f第{page}页采集完成共获取{len(notes_data)}条笔记) except Exception as e: self.logger.error(f第{page}页采集失败: {e}) continue return all_notes def _parse_note_data(self, raw_data: Dict) - NoteData: 解析原始笔记数据 return NoteData( note_idraw_data.get(note_id, ), titleraw_data.get(title, ), descraw_data.get(desc, ), user_idraw_data.get(user, {}).get(user_id, ), nicknameraw_data.get(user, {}).get(nickname, ), like_countraw_data.get(like_count, 0), collect_countraw_data.get(collect_count, 0), comment_countraw_data.get(comment_count, 0), share_countraw_data.get(share_count, 0), tagsraw_data.get(tag_list, []), create_timeraw_data.get(time, 0), update_timeraw_data.get(last_update_time, 0), raw_dataraw_data ) def export_to_excel(self, output_path: str xhs_data.xlsx): 导出数据到Excel with self.storage.get_connection() as conn: df pd.read_sql_query(SELECT * FROM notes, conn) df.to_excel(output_path, indexFalse) self.logger.info(f数据已导出到 {output_path})案例研究电商竞品分析系统业务场景与需求某电商公司希望监控小红书平台上竞品的营销策略和用户反馈需要实现以下功能竞品内容监控跟踪竞品账号发布的所有笔记用户互动分析分析笔记的点赞、评论、收藏数据趋势识别发现热门话题和内容趋势预警机制监测竞品的重要营销活动系统架构设计┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 数据采集层 │ │ 数据处理层 │ │ 数据应用层 │ │ │ │ │ │ │ │ ∙ 账号监控 │───▶│ ∙ 数据清洗 │───▶│ ∙ 竞品分析 │ │ ∙ 内容抓取 │ │ ∙ 特征提取 │ │ ∙ 趋势报告 │ │ ∙ 实时更新 │ │ ∙ 情感分析 │ │ ∙ 预警通知 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 签名服务集群 │ │ 数据存储 │ │ 可视化界面 │ │ │ │ │ │ │ │ ∙ 负载均衡 │ │ ∙ 关系数据库 │ │ ∙ 仪表盘 │ │ ∙ 故障转移 │ │ ∙ 时序数据库 │ │ ∙ 报表系统 │ │ ∙ 性能监控 │ │ ∙ 缓存系统 │ │ ∙ 预警面板 │ └─────────────────┘ └─────────────────┘ └─────────────────┘实现代码示例class CompetitorMonitor: 竞品监控系统 def __init__(self, competitor_ids: List[str]): self.competitor_ids competitor_ids self.collector XhsDataCollector(cookieyour_cookie) def monitor_competitor_activity(self, days: int 7): 监控竞品近期活动 competitor_data {} for competitor_id in self.competitor_ids: try: # 获取用户信息 user_info self.collector.client.get_user_info(competitor_id) # 获取用户笔记 notes self.collector.client.get_user_notes( user_idcompetitor_id, cursor ) # 分析笔记数据 analysis self._analyze_notes(notes) competitor_data[competitor_id] { user_info: user_info, recent_notes: notes, analysis: analysis } self.logger.info(f竞品 {competitor_id} 监控完成) except Exception as e: self.logger.error(f监控竞品 {competitor_id} 失败: {e}) return competitor_data def _analyze_notes(self, notes: List[Dict]) - Dict: 分析笔记数据 if not notes: return {} # 计算基础统计 total_notes len(notes) total_likes sum(note.get(like_count, 0) for note in notes) total_comments sum(note.get(comment_count, 0) for note in notes) total_collects sum(note.get(collect_count, 0) for note in notes) # 分析内容类型 content_types {} for note in notes: # 根据标题和描述判断内容类型 title note.get(title, ).lower() desc note.get(desc, ).lower() if any(keyword in title or keyword in desc for keyword in [促销, 优惠, 折扣]): content_types[promotion] content_types.get(promotion, 0) 1 elif any(keyword in title or keyword in desc for keyword in [教程, 教学, 指南]): content_types[tutorial] content_types.get(tutorial, 0) 1 elif any(keyword in title or keyword in desc for keyword in [测评, 评测, 体验]): content_types[review] content_types.get(review, 0) 1 else: content_types[other] content_types.get(other, 0) 1 # 识别热门话题 tags [] for note in notes: tags.extend(note.get(tag_list, [])) from collections import Counter top_tags Counter(tags).most_common(10) return { total_notes: total_notes, total_likes: total_likes, total_comments: total_comments, total_collects: total_collects, avg_engagement: (total_likes total_comments total_collects) / total_notes if total_notes 0 else 0, content_type_distribution: content_types, top_tags: dict(top_tags) }技术深度解析签名算法的工程实现签名算法逆向工程xhs库的核心技术突破在于成功逆向工程了小红书的签名算法。让我们深入分析其实现原理# 签名算法的关键步骤 def sign(uri, dataNone, ctimeNone, a1, b1): 小红书签名算法实现 1. 生成时间戳 2. 构造原始字符串 3. 计算MD5哈希 4. 进行Base64变种编码 5. 生成最终签名 # 1. 时间戳生成 v int(round(time.time() * 1000) if not ctime else ctime) # 2. 构造签名字符串 raw_str f{v}test{uri}{json.dumps(data, separators(,, :), ensure_asciiFalse) if isinstance(data, dict) else } # 3. MD5哈希计算 md5_str hashlib.md5(raw_str.encode(utf-8)).hexdigest() # 4. 自定义Base64编码 x_s h(md5_str) # h函数实现自定义编码 # 5. 生成签名头 return { x-s: x_s, x-t: str(v), x-s-common: generate_common_header(x_s, str(v), a1, b1) }反检测机制分析小红书采用了多种反检测技术xhs库通过以下方式应对浏览器指纹检测使用Playwright模拟真实浏览器环境行为模式分析实现智能请求延迟模拟人类操作环境一致性验证维护Cookie和会话状态的一致性JavaScript执行检测通过stealth.min.js绕过检测性能优化策略class PerformanceOptimizer: 性能优化管理器 def __init__(self): self.cache {} self.request_timestamps [] def should_throttle(self, max_requests_per_minute60): 请求限流控制 current_time time.time() # 清理一分钟前的请求记录 self.request_timestamps [ ts for ts in self.request_timestamps if current_time - ts 60 ] if len(self.request_timestamps) max_requests_per_minute: return True self.request_timestamps.append(current_time) return False def cache_response(self, key, data, ttl300): 响应缓存机制 self.cache[key] { data: data, expire_time: time.time() ttl } def get_cached_response(self, key): 获取缓存响应 cached self.cache.get(key) if cached and time.time() cached[expire_time]: return cached[data] return None生态整合与数据科学工具链的协作数据预处理流程import pandas as pd import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer import jieba class XhsDataProcessor: 小红书数据处理器 def __init__(self, db_pathxhs_data.db): self.db_path db_path def load_data(self) - pd.DataFrame: 从数据库加载数据 with sqlite3.connect(self.db_path) as conn: df pd.read_sql_query(SELECT * FROM notes, conn) return df def preprocess_text(self, text_series: pd.Series) - pd.Series: 文本预处理 def clean_text(text): if not isinstance(text, str): return # 移除特殊字符 text re.sub(r[^\w\s\u4e00-\u9fff], , text) # 分词 words jieba.lcut(text) return .join(words) return text_series.apply(clean_text) def extract_features(self, df: pd.DataFrame) - pd.DataFrame: 特征提取 # 时间特征 df[create_date] pd.to_datetime(df[create_time], units) df[hour] df[create_date].dt.hour df[day_of_week] df[create_date].dt.dayofweek df[month] df[create_date].dt.month # 互动特征 df[total_interaction] df[like_count] df[comment_count] df[collect_count] df[interaction_rate] df[total_interaction] / df[like_count].clip(lower1) # 文本特征 vectorizer TfidfVectorizer(max_features100) text_features vectorizer.fit_transform( self.preprocess_text(df[title] df[description]) ) # 合并特征 feature_df pd.DataFrame( text_features.toarray(), columns[ftfidf_{i} for i in range(text_features.shape[1])] ) return pd.concat([df, feature_df], axis1)可视化分析示例import matplotlib.pyplot as plt import seaborn as sns from wordcloud import WordCloud class XhsVisualizer: 小红书数据可视化工具 def __init__(self, df: pd.DataFrame): self.df df def plot_engagement_trend(self): 绘制互动趋势图 fig, axes plt.subplots(2, 2, figsize(15, 10)) # 点赞趋势 self.df.groupby(create_date)[like_count].mean().plot( axaxes[0, 0], title平均点赞数趋势 ) # 评论趋势 self.df.groupby(create_date)[comment_count].mean().plot( axaxes[0, 1], title平均评论数趋势 ) # 发布时间分布 self.df[hour].value_counts().sort_index().plot( kindbar, axaxes[1, 0], title发布时间分布小时 ) # 互动率分布 self.df[interaction_rate].hist(axaxes[1, 1], bins30) axes[1, 1].set_title(互动率分布) plt.tight_layout() return fig def generate_wordcloud(self, text_columntitle): 生成词云 all_text .join(self.df[text_column].dropna().tolist()) wordcloud WordCloud( font_pathsimhei.ttf, width800, height400, background_colorwhite ).generate(all_text) plt.figure(figsize(10, 5)) plt.imshow(wordcloud, interpolationbilinear) plt.axis(off) plt.title(小红书笔记标题词云) return plt.gcf()扩展性评估框架系统扩展性考量当项目规模增长时需要考虑以下扩展性因素数据量扩展单机存储限制查询性能优化数据分区策略请求频率扩展分布式签名服务请求队列管理负载均衡设计功能扩展插件化架构API版本管理功能模块解耦分布式架构设计# 分布式签名服务架构示例 class DistributedSignService: 分布式签名服务 def __init__(self, nodes: List[str]): self.nodes nodes self.current_node 0 self.health_check_interval 60 # 秒 def get_available_node(self) - str: 获取可用节点简单的轮询负载均衡 node self.nodes[self.current_node] self.current_node (self.current_node 1) % len(self.nodes) return node def sign_request(self, uri: str, data: Dict None) - Dict: 分布式签名请求 for attempt in range(len(self.nodes)): node self.get_available_node() try: response requests.post( fhttp://{node}/sign, json{uri: uri, data: data}, timeout10 ) return response.json() except Exception as e: print(f节点 {node} 签名失败: {e}) continue raise Exception(所有签名节点均不可用)技术选型决策树开始数据采集项目 │ ├── 需求评估 │ ├── 数据量 1000条/天 → 单机部署 │ ├── 数据量 1000-10000条/天 → 考虑分布式 │ └── 数据量 10000条/天 → 必须分布式 │ ├── 技术选型 │ ├── 开发资源充足 → 自研爬虫 │ ├── 快速上线需求 → 使用xhs库 │ └── 合规要求严格 → 评估法律风险 │ ├── 部署方案 │ ├── 测试环境 → Docker单容器 │ ├── 生产环境小规模 → Docker Compose │ └── 生产环境大规模 → Kubernetes集群 │ └── 监控维护 ├── 基础监控 → 日志告警 ├── 性能监控 → Prometheus Grafana └── 业务监控 → 自定义指标看板最佳实践清单开发阶段使用虚拟环境隔离依赖实现完整的错误处理机制添加详细的日志记录编写单元测试覆盖核心功能配置合理的请求频率控制部署阶段使用Docker容器化部署配置环境变量管理敏感信息设置自动备份机制实现监控和告警系统准备回滚和恢复方案运维阶段定期更新Cookie和签名算法监控API响应状态和成功率分析数据采集质量和完整性优化存储和查询性能定期评估合规性风险未来展望与技术演进技术发展趋势AI增强的数据分析使用机器学习算法识别内容趋势自然语言处理分析用户评论情感计算机视觉分析图片和视频内容实时数据处理流式处理架构支持实时监控复杂事件处理识别重要事件实时告警和通知机制多云部署架构跨云平台的容灾设计边缘计算降低延迟混合云数据同步功能扩展方向class AdvancedXhsAnalytics: 高级分析功能扩展 def sentiment_analysis(self, comments: List[str]) - Dict: 评论情感分析 # 实现情感分析逻辑 pass def topic_modeling(self, notes: List[Dict]) - List[str]: 主题建模分析 # 使用LDA或BERT进行主题发现 pass def influencer_identification(self, threshold: int 10000) - List[Dict]: KOL识别 # 基于互动数据识别影响力用户 pass def trend_prediction(self, historical_data: pd.DataFrame) - pd.DataFrame: 趋势预测 # 使用时间序列分析预测未来趋势 pass结语技术赋能业务决策通过xhs库我们不仅获得了一个高效的小红书数据采集工具更重要的是构建了一套完整的数据驱动决策体系。从技术实现到业务应用从单机部署到分布式架构这个项目展示了如何将复杂的技术挑战转化为可管理的工程问题。在实际应用中建议团队根据自身业务需求和技术能力选择合适的部署方案和扩展路径。记住技术工具的价值最终体现在对业务决策的支持上。合理使用数据采集工具结合专业的分析方法才能真正发挥数据的价值。无论你是市场分析师、内容创作者还是技术开发者掌握小红书数据采集技术都将为你的工作带来新的视角和可能性。在合规的前提下让数据成为你决策的智慧之源。【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考