Python小红书数据采集终极指南:从零开始构建完整自动化方案
Python小红书数据采集终极指南从零开始构建完整自动化方案【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs在小红书数据分析和竞品监控领域传统的手动采集方式效率低下且难以规模化。xhs工具作为一款专业的Python小红书数据采集库为开发者提供了稳定、高效的自动化解决方案。这个开源项目封装了小红书Web端的核心接口让技术开发者和数据爱好者能够轻松获取笔记、用户、搜索等公开数据为内容分析、市场研究和商业决策提供强有力的数据支持。技术原理解密小红书数据采集的核心机制接口封装与反爬策略xhs工具的核心价值在于它巧妙地绕过了小红书平台的复杂反爬机制。传统爬虫开发需要处理动态签名、验证码、IP限制等多重挑战而xhs通过以下技术手段实现了稳定可靠的数据采集签名验证机制小红书API请求需要动态签名xhs工具内置了完整的签名算法实现自动处理请求参数的加密和验证。Cookie管理工具提供了完善的Cookie管理机制支持持久化存储和自动更新确保长时间运行的稳定性。请求伪装模拟真实浏览器行为包括完整的请求头设置和会话管理降低被识别为机器人的风险。核心架构设计xhs工具采用分层架构设计将数据采集、处理和分析功能模块化数据采集层 → 数据处理层 → 应用接口层 → 业务逻辑层每个层级都有明确的职责划分确保代码的可维护性和扩展性。核心源码位于xhs/core.py包含了主要的API接口实现和业务逻辑。快速上手攻略5分钟完成环境配置安装部署步骤环境要求Python 3.7或更高版本requests库lxml库安装命令# 从PyPI安装稳定版本 pip install xhs # 或从Git仓库安装最新版本 git clone https://gitcode.com/gh_mirrors/xh/xhs cd xhs pip install -e .基础配置指南获取必要的认证信息是使用xhs工具的第一步获取小红书Cookie登录小红书网页版按F12打开开发者工具在Network标签中查找任意请求复制Request Headers中的Cookie字段配置签名函数 项目提供了完整的签名示例可以参考example/basic_sign_server.py快速搭建签名服务。第一个采集脚本让我们创建一个简单的脚本来验证安装是否成功from xhs import XhsClient # 初始化客户端 cookie your_xiaohongshu_cookie_here xhs_client XhsClient(cookie) # 测试获取笔记详情 note_id 6505318c000000001f03c5a6 note_data xhs_client.get_note_by_id(note_id) print(f笔记标题{note_data.get(title, 无标题)}) print(f作者{note_data.get(user, {}).get(nickname, 匿名)}) print(f点赞数{note_data.get(likes, 0)}) print(f收藏数{note_data.get(collects, 0)})实战场景应用小红书数据分析的三种典型方案方案一竞品内容监控系统对于品牌营销团队来说监控竞品在小红书上的表现至关重要。以下是一个完整的竞品分析方案import pandas as pd from datetime import datetime, timedelta from xhs import XhsClient class CompetitorAnalyzer: def __init__(self, cookie): self.client XhsClient(cookie) def analyze_competitor_performance(self, competitor_id, days30): 分析竞品最近30天的内容表现 all_notes [] current_page 1 while True: try: notes self.client.get_user_notes(competitor_id, pagecurrent_page) if not notes: break # 过滤最近指定天数的笔记 cutoff_date datetime.now() - timedelta(daysdays) recent_notes [ note for note in notes if datetime.fromtimestamp(note[time]/1000) cutoff_date ] all_notes.extend(recent_notes) current_page 1 time.sleep(1) # 避免请求过快 except Exception as e: print(f获取第{current_page}页失败: {e}) break # 数据分析和可视化 if not all_notes: return None df pd.DataFrame(all_notes) # 计算关键指标 analysis_result { total_notes: len(df), avg_likes: round(df[likes].mean(), 2), avg_comments: round(df[comments].mean(), 2), avg_shares: round(df[shares].mean(), 2), avg_collects: round(df[collects].mean(), 2), best_performing_note: df.loc[df[likes].idxmax()].to_dict(), content_types: df[type].value_counts().to_dict() } return analysis_result方案二热门话题趋势追踪追踪特定话题的热度变化发现内容趋势和机会点class TopicTracker: def __init__(self, cookie): self.client XhsClient(cookie) def track_topic_trend(self, keyword, days7, max_pages5): 追踪话题热度变化趋势 trend_data {} for day_offset in range(days): date datetime.now() - timedelta(daysday_offset) date_str date.strftime(%Y-%m-%d) daily_notes [] for page in range(1, max_pages 1): try: results self.client.get_note_by_keyword( keywordkeyword, pagepage, sorttime # 按时间排序获取最新内容 ) daily_notes.extend(results) time.sleep(1) except Exception as e: print(f第{page}页搜索失败: {e}) break if daily_notes: trend_data[date_str] { total_notes: len(daily_notes), avg_engagement: sum(n[likes] n[comments] n[shares] for n in daily_notes) / len(daily_notes), top_performer: max(daily_notes, keylambda x: x[likes]), note_ids: [n[id] for n in daily_notes[:10]] # 记录前10篇笔记ID } return trend_data方案三内容质量评估模型基于互动数据评估内容质量为内容创作提供数据支持class ContentQualityEvaluator: def __init__(self, cookie): self.client XhsClient(cookie) def evaluate_note_quality(self, note_id): 评估单篇笔记的质量 try: note self.client.get_note_by_id(note_id) # 计算互动率指标 likes note.get(likes, 0) comments note.get(comments, 0) shares note.get(shares, 0) collects note.get(collects, 0) total_interactions likes comments shares collects # 质量评分算法 quality_score ( likes * 0.4 comments * 0.3 shares * 0.2 collects * 0.1 ) # 内容深度分析 content_length len(note.get(desc, )) len(note.get(title, )) has_images len(note.get(images, [])) 0 has_video video in note and note[video] evaluation_result { note_id: note_id, quality_score: round(quality_score, 2), interaction_rate: round(total_interactions / max(likes, 1), 4), content_depth: 高 if content_length 500 else 中 if content_length 200 else 低, media_richness: 视频 if has_video else 图文 if has_images else 纯文本, recommended_actions: self._generate_recommendations(note) } return evaluation_result except Exception as e: print(f评估笔记 {note_id} 失败: {e}) return None def _generate_recommendations(self, note): 基于分析结果生成改进建议 recommendations [] if note.get(likes, 0) 100: recommendations.append(增加互动引导语) if len(note.get(desc, )) 200: recommendations.append(丰富内容描述) if len(note.get(images, [])) 3: recommendations.append(添加更多高质量图片) return recommendations进阶技巧分享性能优化与错误处理性能优化策略优化维度具体措施预期效果请求优化批量请求合并减少请求次数30%缓存策略Redis缓存已获取数据降低重复请求50%并发控制异步请求处理提升采集速度3-5倍数据压缩gzip压缩传输减少带宽消耗60%异步采集实现使用异步编程可以大幅提升数据采集效率import asyncio import aiohttp from xhs import XhsClient class AsyncXhsClient: def __init__(self, cookie, max_concurrent5): self.cookie cookie self.max_concurrent max_concurrent self.semaphore asyncio.Semaphore(max_concurrent) async def fetch_note_async(self, note_id): 异步获取笔记数据 async with self.semaphore: try: # 这里需要实现异步请求逻辑 # 实际项目中可以使用aiohttp替代requests note await self._async_get_note(note_id) return note except Exception as e: print(f异步获取笔记 {note_id} 失败: {e}) return None async def batch_fetch_notes(self, note_ids): 批量异步获取笔记 tasks [self.fetch_note_async(note_id) for note_id in note_ids] results await asyncio.gather(*tasks, return_exceptionsTrue) return results错误处理与重试机制健壮的错误处理是生产环境应用的关键from xhs.exception import DataFetchError, IPBlockError import time import random class RobustXhsClient: def __init__(self, cookie, max_retries3, base_delay1): self.client XhsClient(cookie) self.max_retries max_retries self.base_delay base_delay def safe_request(self, func, *args, **kwargs): 带重试机制的安全请求 for attempt in range(self.max_retries): try: return func(*args, **kwargs) except (DataFetchError, IPBlockError) as e: if attempt self.max_retries - 1: raise # 指数退避 随机抖动 delay self.base_delay * (2 ** attempt) random.uniform(0, 0.1) print(f请求失败{delay:.2f}秒后重试... (第{attempt1}次)) time.sleep(delay) except Exception as e: print(f未知错误: {e}) raise问题诊断手册常见问题与解决方案Q1: 如何解决签名验证失败错误问题分析签名验证失败通常是由于签名函数配置不正确或Cookie过期导致的。解决方案检查Cookie是否有效重新获取最新Cookie验证签名函数是否正确实现参考example/basic_sign_usage.py确保请求参数格式正确特别是时间戳和随机数Q2: 遇到IP被限制怎么办问题分析短时间内大量请求可能导致IP被暂时限制。解决方案降低请求频率添加适当延迟使用代理IP轮换机制实现请求队列和速率限制参考example/basic_usage.py中的最佳实践Q3: 数据采集速度慢如何优化优化建议启用异步请求处理实现数据缓存机制批量处理相似请求优化网络连接和DNS解析Q4: 如何确保数据采集的合规性合规指南仅采集公开可访问的数据尊重robots.txt协议添加User-Agent标识控制请求频率避免对服务器造成压力不采集用户隐私信息生态整合方案与其他工具的协同工作与数据分析工具集成xhs工具可以与主流的数据分析工具无缝集成Pandas数据分析import pandas as pd from xhs import XhsClient # 采集数据并转换为DataFrame client XhsClient(cookie) notes_data client.get_user_notes(user_iduser123, page1) # 创建DataFrame进行数据分析 df pd.DataFrame(notes_data) # 数据分析示例 print(f总笔记数: {len(df)}) print(f平均点赞数: {df[likes].mean():.2f}) print(f互动率最高的笔记: {df.loc[df[likes].idxmax()][title]})可视化展示import matplotlib.pyplot as plt import seaborn as sns # 数据可视化 plt.figure(figsize(12, 6)) sns.histplot(df[likes], bins30, kdeTrue) plt.title(笔记点赞数分布) plt.xlabel(点赞数) plt.ylabel(频次) plt.show()与数据库系统集成将采集的数据存储到数据库中进行持久化管理import sqlite3 from datetime import datetime class XhsDataStorage: def __init__(self, db_pathxhs_data.db): self.conn sqlite3.connect(db_path) self.create_tables() def create_tables(self): 创建数据表结构 cursor self.conn.cursor() # 笔记数据表 cursor.execute( CREATE TABLE IF NOT EXISTS notes ( id TEXT PRIMARY KEY, title TEXT, user_id TEXT, nickname TEXT, likes INTEGER, comments INTEGER, shares INTEGER, collects INTEGER, publish_time TIMESTAMP, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) # 用户数据表 cursor.execute( CREATE TABLE IF NOT EXISTS users ( user_id TEXT PRIMARY KEY, nickname TEXT, fans INTEGER, likes INTEGER, notes INTEGER, last_updated TIMESTAMP ) ) self.conn.commit() def save_note(self, note_data): 保存笔记数据 cursor self.conn.cursor() cursor.execute( INSERT OR REPLACE INTO notes (id, title, user_id, nickname, likes, comments, shares, collects, publish_time, content) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , ( note_data.get(id), note_data.get(title), note_data.get(user, {}).get(user_id), note_data.get(user, {}).get(nickname), note_data.get(likes, 0), note_data.get(comments, 0), note_data.get(shares, 0), note_data.get(collects, 0), datetime.fromtimestamp(note_data.get(time, 0) / 1000), note_data.get(desc, ) )) self.conn.commit()与自动化工作流集成结合Airflow等调度工具实现自动化数据管道from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime, timedelta from xhs import XhsClient def collect_xhs_data(**context): 数据采集任务 cookie context[params][cookie] user_ids context[params][user_ids] client XhsClient(cookie) storage XhsDataStorage() for user_id in user_ids: notes client.get_user_notes(user_id, page1) for note in notes: storage.save_note(note) return f成功采集{len(user_ids)}个用户的数据 # 定义DAG default_args { owner: data_team, depends_on_past: False, start_date: datetime(2024, 1, 1), retries: 3, retry_delay: timedelta(minutes5), } dag DAG( xhs_data_pipeline, default_argsdefault_args, description小红书数据自动化采集管道, schedule_interval0 2 * * *, # 每天凌晨2点执行 catchupFalse ) collect_task PythonOperator( task_idcollect_xhs_data, python_callablecollect_xhs_data, params{ cookie: your_cookie_here, user_ids: [user1, user2, user3] }, dagdag )最佳实践总结技术选型建议使用场景推荐方案优势小规模采集直接使用XhsClient简单快速无需额外配置大规模生产异步采集数据库存储高性能可扩展性强实时监控定时任务消息队列实时性高响应迅速数据分析与Pandas/Spark集成数据处理能力强分析深度高性能调优要点请求优化合并相似请求减少网络开销缓存策略使用Redis缓存热点数据并发控制合理设置并发数避免被封禁错误处理实现完善的异常处理和重试机制监控告警建立系统监控和异常告警机制合规使用指南✅允许的操作采集公开的笔记数据进行研究分析用于个人学习和小规模项目遵守平台的robots.txt规则添加适当的请求间隔❌禁止的行为大规模商业数据采集侵犯用户隐私对服务器造成压力违反平台用户协议资源汇总与后续学习核心文档资源API文档docs/source/xhs.rst - 完整的API接口说明示例代码example/ - 丰富的使用示例测试用例tests/ - 功能测试和验证源码分析xhs/core.py - 核心实现逻辑学习路径建议入门阶段掌握基础API调用完成简单数据采集进阶阶段学习异步编程和性能优化实战阶段构建完整的数据分析系统专家阶段贡献代码参与社区开发社区支持与贡献xhs工具是一个活跃的开源项目欢迎开发者提交Issue报告问题或提出改进建议贡献代码参与功能开发和bug修复分享案例分享使用经验和最佳实践完善文档帮助改进文档和示例代码通过本指南你已经掌握了使用xhs工具进行小红书数据采集的完整技能栈。从基础的环境配置到高级的性能优化从简单的数据采集到复杂的系统集成这套方案能够满足不同场景下的数据需求。记住技术只是工具合理、合规地使用这些工具才能为你的业务创造真正的价值。开始你的小红书数据采集之旅吧如果有任何问题欢迎参考项目文档和示例代码或参与社区讨论获取帮助。【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

【差旅费用智能稽核黄金法则】:基于千万级报销数据训练的12类异常模式识别模型首度开源

【差旅费用智能稽核黄金法则】:基于千万级报销数据训练的12类异常模式识别模型首度开源

更多请点击: https://codechina.net 第一章:差旅费用智能稽核黄金法则的演进与价值定位 差旅费用稽核正经历从人工抽检到规则引擎驱动、再到AI增强型闭环治理的范式跃迁。早期依赖财务人员逐单比对发票、行程单与审批流,不仅耗时长、漏检率高…

2026/9/24 3:05:07 阅读更多 →
乒乓球口袋教练 HarmonyOS 学习应用(04):测验题库与动作判断反馈

乒乓球口袋教练 HarmonyOS 学习应用(04):测验题库与动作判断反馈

一、动作判断反馈需要保存哪些上下文 测验不是把选项染成对错颜色就结束。为了让动作判断有学习价值,结果页需要保留模块、题目、选择、正确答案和解释的上下文;否则用户只得到一个分数,不知道是发球落点、接发判断还是相持节奏出现偏差。 e…

2026/9/24 14:25:49 阅读更多 →
OC6830E 2.7~36V宽输入升压控制器:兼容单节锂电至24V工业总线-聚能芯-欧创芯官方授权一级代理

OC6830E 2.7~36V宽输入升压控制器:兼容单节锂电至24V工业总线-聚能芯-欧创芯官方授权一级代理

在EPC/笔记本车载适配器及各类升压、升降压转换应用中,电源设计人员经常面临宽输入电压范围、高转换效率与系统简洁性之间的多重挑战。传统方案往往需要外置功率MOS管和复杂的外围电路,增加了设计难度和BOM成本。OC6830E是一款专为升压、升降压开关电源设…

2026/9/23 8:13:33 阅读更多 →

最新新闻

OpenCode 与 OpenCLAW 的 AI 模型配置:用 TaoToken 统一 Key 打通多工具调用

OpenCode 与 OpenCLAW 的 AI 模型配置:用 TaoToken 统一 Key 打通多工具调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:13:40 阅读更多 →
ORACLE 经验两则:Sys_Refcursor 与外部表 SKIP 的配置骨架

ORACLE 经验两则:Sys_Refcursor 与外部表 SKIP 的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:13:40 阅读更多 →
Claude 在得物 App 数仓的深度集成与效能演进:TaoToken 统一 Key 通道配置实战

Claude 在得物 App 数仓的深度集成与效能演进:TaoToken 统一 Key 通道配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:13:40 阅读更多 →
WorkBuddy Enterprise 企业级 Agent 平台架构与 MCP 落地实践

WorkBuddy Enterprise 企业级 Agent 平台架构与 MCP 落地实践

1. 从「超级个体」到「超级团队」:这个平台到底在解决什么问题第一次看到「WorkBuddy Enterprise」这个名字,我脑子里蹦出来的第一个念头是:腾讯云终于把 CodeBuddy 那套东西往企业级方向推了。如果你最近半年一直在关注 Agent 开发这条线&am…

2026/9/25 13:13:40 阅读更多 →
Atlas 300V 24G实战:AI推理加速卡部署YOLO全流程

Atlas 300V 24G实战:AI推理加速卡部署YOLO全流程

很多人都为一个词搜过来:atlas。准确讲,搜到atlas又能和部署yolo扯上关系的,多半是盯上了华为Atlas 300V 24G这块卡。今天我不绕圈子,先说结论:Atlas 300V 24G确实是一块运算加速卡,但它更准确的定位&#…

2026/9/25 13:13:40 阅读更多 →
MySQL表空间传输:从原理到实战,把大表迁移从小时级压缩到分钟级

MySQL表空间传输:从原理到实战,把大表迁移从小时级压缩到分钟级

老规矩,先给结论:MySQL自带的表空间传输(Transportable Tablespace)功能,是处理“单表或一批表快速换实例”最好用的手段之一,尤其在数据量已经上到几十GB、几百GB,mysqldump导出导入慢到让人抓…

2026/9/25 13:12:40 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →