news 2026/4/16 15:56:57

从小白到高手:小红书数据采集的5大核心策略与实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从小白到高手:小红书数据采集的5大核心策略与实战指南

从小白到高手:小红书数据采集的5大核心策略与实战指南

【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs

你是否想过如何获取小红书上的热门笔记数据却不知从何入手?面对复杂的API接口和频繁变化的参数感到无从应对?想通过数据分析发现小红书平台的内容趋势却被技术门槛阻挡?今天我将带你用5大核心策略,轻松掌握小红书数据采集的方法,让你从数据小白变身采集达人!

核心策略一:如何快速搭建小红书数据采集基础框架?

基础原理

小红书作为热门的生活方式分享平台,提供了丰富的公开数据资源。要合法合规地采集这些数据,我们可以利用官方API或基于Web端的请求封装库。本策略将使用xhs库,这是一个基于小红书Web端进行的请求封装工具,让数据采集变得简单高效。

实施步骤

  1. 首先安装必要的工具包:
pip install xhs
  1. 基础采集框架搭建:
# 导入必要的库 from xhs import XhsClient import json # 初始化客户端 client = XhsClient( cookie="你的cookie信息" # 从浏览器获取的小红书cookie ) # 验证连接 try: # 获取推荐笔记列表 notes = client.get_recommended_notes() print(f"成功连接到小红书,获取到{len(notes)}条推荐笔记") # 打印第一条笔记的基本信息 if notes: print(json.dumps(notes[0], ensure_ascii=False, indent=2)) except Exception as e: print(f"连接失败: {str(e)}")

避坑指南

  • Cookie获取:登录小红书网页版,通过浏览器开发者工具(按F12)的Application->Cookies获取所需cookie
  • Cookie有效期:小红书cookie通常有效期为7-14天,过期后需要重新获取
  • 初始设置:建议使用专用账号进行数据采集,避免个人主账号被限制
  • 环境隔离:在开发环境中使用虚拟环境,避免依赖冲突

专家问答

问:为什么需要使用cookie而不是账号密码登录?
答:小红书API目前没有公开的认证机制,使用cookie是最直接有效的方式。通过浏览器获取的cookie包含了登录状态信息,能够模拟正常用户访问。

问:获取cookie有哪些注意事项?
答:获取cookie时应确保:1)保持登录状态;2)不要泄露自己的cookie给他人;3)定期更新cookie以维持访问权限;4)避免在短时间内频繁获取cookie。

核心策略二:如何高效采集小红书笔记数据?

基础原理

小红书笔记数据包含标题、内容、标签、互动数据等丰富信息。通过合理调用API接口,可以实现批量采集。分页机制是高效采集的关键,需要理解"游标(cursor)"的概念和使用方法。

实施步骤

def get_notes_by_keyword(keyword, max_count=50): """ 根据关键词搜索并获取笔记数据 :param keyword: 搜索关键词 :param max_count: 最大获取数量 :return: 笔记列表 """ notes = [] cursor = "" while len(notes) < max_count: # 搜索笔记 search_result = client.search_notes( keyword=keyword, page=1, page_size=20, cursor=cursor ) # 提取笔记数据 if "items" not in search_result: break notes_batch = search_result["items"] notes.extend(notes_batch) # 获取下一页游标 cursor = search_result.get("cursor", "") if not cursor: # 没有更多数据 break # 控制请求频率,避免触发反爬 import time time.sleep(2) return notes[:max_count] # 使用示例 fashion_notes = get_notes_by_keyword("春季穿搭", max_count=100) print(f"成功获取{len(fashion_notes)}条关于'春季穿搭'的笔记") # 数据处理示例 processed_data = [] for note in fashion_notes: processed_data.append({ "笔记ID": note["note_id"], "标题": note["title"], "作者": note["user"]["nickname"], "发布时间": note["time"], "点赞数": note["stats"]["like_count"], "收藏数": note["stats"]["collect_count"], "评论数": note["stats"]["comment_count"], "分享数": note["stats"]["share_count"], "标签": [tag["name"] for tag in note.get("tags", [])] })

避坑指南

  • 请求频率控制:设置合理的请求间隔(2-3秒),避免短时间内大量请求
  • 异常处理:添加try-except块处理请求失败情况
  • 数据验证:对返回数据进行检查,确保关键字段存在
  • 批量处理:对大量数据采用分批处理方式,避免内存占用过大

专家问答

问:如何提高搜索结果的相关性?
答:可以通过以下方式优化搜索:1)使用更精确的关键词;2)结合标签进行搜索;3)指定时间范围;4)利用筛选条件(如最热、最新)。

问:笔记内容中包含的图片如何处理?
答:笔记中的图片URL可以通过note["image_list"]获取,对于图片数据,可以选择只保存URL供后续处理,或使用专门的图片下载函数批量保存。

核心策略三:如何有效应对小红书的反爬机制?

基础原理

小红书有严格的反爬机制,包括请求频率限制、IP跟踪、行为分析等。理解这些机制并采取相应策略,可以显著提高采集成功率。

实施步骤

import time import random from fake_useragent import UserAgent from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry # 1. 随机User-Agent设置 ua = UserAgent() headers = { "User-Agent": ua.random, "Accept": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.9", "Referer": "https://www.xiaohongshu.com/" } # 2. 重试机制设置 def create_session_with_retry(): session = requests.Session() retry = Retry( total=3, read=3, connect=3, backoff_factor=0.5, status_forcelist=(500, 502, 504) ) adapter = HTTPAdapter(max_retries=retry) session.mount('http://', adapter) session.mount('https://', adapter) return session # 3. 智能请求间隔 def smart_sleep(base_interval=2): """智能设置请求间隔,增加随机性""" sleep_time = base_interval + random.uniform(0, 1) time.sleep(sleep_time) return sleep_time # 4. 带反爬策略的请求函数 def safe_request(url, params=None, method="get"): """带反爬策略的安全请求函数""" session = create_session_with_retry() session.headers.update(headers) try: if method.lower() == "get": response = session.get(url, params=params) else: response = session.post(url, data=params) # 检查响应状态 response.raise_for_status() # 随机延迟 smart_sleep() return response.json() except Exception as e: print(f"请求异常: {str(e)}") # 遇到错误时增加延迟 time.sleep(5) return None

避坑指南

  • User-Agent池:使用fake_useragent库生成不同的浏览器标识
  • IP轮换:对于大规模采集,可以考虑使用代理IP池
  • 行为模拟:模拟真实用户的浏览行为,避免固定的请求模式
  • 异常处理:对403、429等状态码要有专门的处理逻辑
  • 账号轮换:使用多个账号的cookie进行轮换,分散风险

专家问答

问:如何判断自己是否被反爬机制识别?
答:常见迹象包括:1)返回403/429状态码;2)返回空数据或错误数据;3)需要重新登录;4)请求成功率突然下降。此时应立即停止采集,检查并调整策略。

问:使用代理IP有哪些注意事项?
答:选择代理IP时应注意:1)优先使用高匿代理;2)测试代理速度和稳定性;3)避免使用免费代理;4)定期更换代理IP;5)监控代理的使用情况,及时剔除无效代理。

核心策略四:如何采集小红书用户数据与互动信息?

基础原理

用户数据和互动信息是分析平台生态的重要依据。小红书提供了获取用户基本信息、发布的笔记、收藏列表以及笔记评论等功能接口,通过合理调用这些接口可以构建完整的用户画像。

实施步骤

def get_user_profile(user_id): """获取用户基本信息""" try: profile = client.get_user_profile(user_id) return { "用户ID": profile["user_id"], "昵称": profile["nickname"], "头像": profile["avatar"], "简介": profile["desc"], "关注数": profile["following_count"], "粉丝数": profile["follower_count"], "笔记数": profile["note_count"], "获赞与收藏数": profile["liked_count"] } except Exception as e: print(f"获取用户信息失败: {str(e)}") return None def get_note_comments(note_id, max_comments=50): """获取笔记评论""" comments = [] cursor = "" while len(comments) < max_comments: try: result = client.get_note_comments( note_id=note_id, cursor=cursor, num=20 ) if "comments" not in result: break comments_batch = result["comments"] comments.extend(comments_batch) cursor = result.get("cursor", "") if not cursor: break # 控制请求频率 time.sleep(2) except Exception as e: print(f"获取评论失败: {str(e)}") break return comments[:max_comments] # 使用示例 if fashion_notes: # 获取第一条笔记的评论 note_id = fashion_notes[0]["note_id"] comments = get_note_comments(note_id, max_comments=100) print(f"成功获取{len(comments)}条评论") # 获取作者信息 user_id = fashion_notes[0]["user"]["user_id"] user_profile = get_user_profile(user_id) if user_profile: print(f"作者信息: {user_profile['昵称']},粉丝数: {user_profile['粉丝数']}")

避坑指南

  • 隐私保护:注意用户隐私,不采集和传播个人敏感信息
  • 评论深度:评论有层级结构,获取二级评论需要额外处理
  • 数据完整性:部分用户信息可能因隐私设置无法获取
  • 频率控制:用户相关接口比笔记接口更敏感,建议设置更长的请求间隔

专家问答

问:如何处理评论中的表情符号和特殊字符?
答:可以使用Python的emoji库处理表情符号,对于特殊字符,可以使用str.encode('utf-8', errors='ignore')进行过滤,或使用unicodedata库进行规范化处理。

问:用户发布的笔记数量很多时,如何高效获取全部笔记?
答:可以通过分页机制循环获取,注意:1)设置合理的每次请求数量(10-20条);2)使用游标(cursor)跟踪分页位置;3)增加请求间隔避免触发限制;4)实现断点续传,记录已获取的笔记ID避免重复。

核心策略五:数据采集的伦理与合规边界在哪里?

基础原理

数据采集涉及隐私保护和平台规则,了解相关法律法规和平台政策是每个数据采集者的责任。合法合规的数据采集不仅能避免法律风险,也是数据伦理的基本要求。

实施步骤

  1. 了解相关法律法规

    • 《网络安全法》
    • 《个人信息保护法》
    • 《数据安全法》
    • 平台用户协议和robots.txt文件
  2. 合规采集实践

def is_compliant_data采集(note_data): """检查数据是否符合合规要求""" # 1. 过滤敏感信息 sensitive_fields = ["email", "phone", "address", "id_card"] filtered_data = {} for key, value in note_data.items(): if key in sensitive_fields: continue # 对于用户信息,只保留公开可访问的基本信息 if key == "user": filtered_user = { "user_id": value.get("user_id"), "nickname": value.get("nickname"), "avatar": value.get("avatar") } filtered_data[key] = filtered_user else: filtered_data[key] = value return filtered_data # 合规使用数据示例 def compliant_data_usage(data, purpose="analysis"): """合规使用采集的数据""" # 记录数据来源和采集时间 data["采集来源"] = "小红书公开数据" data["采集时间"] = time.strftime("%Y-%m-%d %H:%M:%S") # 根据使用目的限制数据范围 if purpose == "analysis": # 仅保留分析所需字段 return { "note_id": data.get("note_id"), "title": data.get("title"), "tags": [tag["name"] for tag in data.get("tags", [])], "stats": data.get("stats", {}), "采集时间": data["采集时间"] } elif purpose == "display": # 用于展示时需去除所有用户标识 return { "title": data.get("title"), "tags": [tag["name"] for tag in data.get("tags", [])], "stats": data.get("stats", {}), "采集时间": data["采集时间"] } else: return data
  1. 合规声明模板
数据采集与使用声明: 1. 本项目采集的数据均来自小红书公开可访问内容 2. 数据仅用于学习研究目的,不用于商业用途 3. 已对采集数据进行脱敏处理,去除个人敏感信息 4. 如涉及侵权,请联系删除 5. 采集频率严格控制在合理范围,不影响平台正常运营

避坑指南

  • 明确采集目的:仅为合法目的采集数据,不用于未授权的商业用途
  • 数据脱敏:去除或匿名化个人敏感信息,如姓名、联系方式、具体地址等
  • 使用限制:采集的数据不得用于歧视、骚扰或其他不当行为
  • 尊重robots协议:检查并遵守平台的robots.txt规则
  • 适度采集:控制采集规模和频率,避免对平台服务器造成负担

专家问答

问:个人学习使用采集的数据是否需要获得平台授权?
答:根据《个人信息保护法》,即使是个人学习使用,采集个人信息也需要获得信息主体同意。对于公开的非个人信息数据,虽然无需明确授权,但仍需遵守平台规则和使用限制,不得滥用或超出合理范围使用。

问:如何判断哪些数据属于个人敏感信息?
答:个人敏感信息通常包括:身份证号、手机号、邮箱地址、具体住址、银行账号、健康信息等。在小红书数据采集中,需要特别注意:1)不采集用户的私人信息;2)不将公开信息与其他来源的个人信息关联;3)对可识别个人身份的信息进行匿名化处理。

实战案例:小红书美妆类笔记数据分析项目

项目目标

采集小红书平台上美妆类热门笔记数据,分析用户偏好和内容趋势,为美妆品牌提供市场决策参考。

实施流程

  1. 项目准备
# 1. 克隆项目仓库 git clone https://gitcode.com/gh_mirrors/xh/xhs cd xhs # 2. 安装依赖 pip install -r requirements.txt
  1. 数据采集模块实现
#美妆笔记采集脚本: collect_makeup_notes.py from xhs import XhsClient import json import time import pandas as pd from datetime import datetime class MakeupNotesCollector: def __init__(self, cookie): self.client = XhsClient(cookie=cookie) self.keywords = ["口红推荐", "粉底液测评", "眼影盘种草", "美妆教程", "护肤步骤"] self.data = [] def collect_notes(self, max_per_keyword=50): """按关键词采集笔记""" for keyword in self.keywords: print(f"开始采集关键词: {keyword}") notes = self._search_notes_by_keyword(keyword, max_per_keyword) self.data.extend(notes) print(f"关键词 {keyword} 采集完成,获取 {len(notes)} 条笔记") time.sleep(5) # 关键词间增加间隔 return self.data def _search_notes_by_keyword(self, keyword, max_count): """搜索特定关键词的笔记""" notes = [] cursor = "" while len(notes) < max_count: try: result = self.client.search_notes( keyword=keyword, page=1, page_size=20, cursor=cursor ) if "items" not in result: break notes_batch = result["items"] notes.extend(notes_batch) cursor = result.get("cursor", "") if not cursor: break time.sleep(2) # 控制请求频率 except Exception as e: print(f"搜索出错: {str(e)}") break return notes[:max_count] def save_to_csv(self, filename=None): """保存数据到CSV文件""" if not filename: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"makeup_notes_{timestamp}.csv" # 数据处理 processed_data = [] for note in self.data: processed_data.append({ "note_id": note["note_id"], "title": note["title"], "keyword": self._find_matching_keyword(note["title"]), "user_id": note["user"]["user_id"], "nickname": note["user"]["nickname"], "post_time": note["time"], "like_count": note["stats"]["like_count"], "collect_count": note["stats"]["collect_count"], "comment_count": note["stats"]["comment_count"], "share_count": note["stats"]["share_count"], "tags": ",".join([tag["name"] for tag in note.get("tags", [])]) }) df = pd.DataFrame(processed_data) df.to_csv(filename, index=False, encoding="utf-8-sig") print(f"数据已保存到 {filename},共 {len(processed_data)} 条记录") return filename def _find_matching_keyword(self, title): """找到与标题匹配的关键词""" title_lower = title.lower() for keyword in self.keywords: if keyword in title_lower: return keyword return "其他" # 使用方法 if __name__ == "__main__": # 替换为你的cookie cookie = "你的小红书cookie" collector = MakeupNotesCollector(cookie) collector.collect_notes(max_per_keyword=100) csv_file = collector.save_to_csv()
  1. 数据分析与可视化
# 数据分析脚本: analyze_makeup_notes.py import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from wordcloud import WordCloud import jieba from collections import Counter class MakeupNotesAnalyzer: def __init__(self, csv_file): self.df = pd.read_csv(csv_file) # 转换时间格式 self.df["post_time"] = pd.to_datetime(self.df["post_time"], unit="s") def basic_statistics(self): """基本统计信息""" print("===== 基本统计信息 =====") print(f"总笔记数: {len(self.df)}") print(f"关键词分布:\n{self.df['keyword'].value_counts()}") print(f"平均点赞数: {self.df['like_count'].mean():.2f}") print(f"平均收藏数: {self.df['collect_count'].mean():.2f}") print(f"平均评论数: {self.df['comment_count'].mean():.2f}") def visualize_keyword_performance(self): """关键词表现可视化""" plt.figure(figsize=(15, 7)) # 关键词互动数据比较 stats_by_keyword = self.df.groupby("keyword").agg({ "like_count": "mean", "collect_count": "mean", "comment_count": "mean" }).reset_index() # 绘制柱状图 stats_by_keyword.set_index("keyword").plot(kind="bar") plt.title("不同美妆关键词的平均互动数据对比") plt.ylabel("数量") plt.tight_layout() plt.savefig("keyword_performance.png") plt.close() def visualize_post_time(self): """发布时间分布可视化""" plt.figure(figsize=(12, 6)) # 提取小时信息 self.df["post_hour"] = self.df["post_time"].dt.hour # 绘制发布时间分布 sns.countplot(data=self.df, x="post_hour") plt.title("美妆笔记发布时间分布") plt.xlabel("小时") plt.ylabel("笔记数量") plt.tight_layout() plt.savefig("post_time_distribution.png") plt.close() def generate_tag_wordcloud(self): """生成标签词云""" # 提取所有标签 all_tags = [] for tags in self.df["tags"]: if pd.notna(tags): all_tags.extend(tags.split(",")) # 统计标签频率 tag_counts = Counter(all_tags) # 生成词云 wordcloud = WordCloud( font_path="simhei.ttf", # 指定中文字体 width=1000, height=600, background_color="white" ).generate_from_frequencies(tag_counts) # 保存词云图 plt.figure(figsize=(12, 8)) plt.imshow(wordcloud, interpolation="bilinear") plt.axis("off") plt.tight_layout() plt.savefig("tag_wordcloud.png") plt.close() def run_all_analysis(self): """运行所有分析""" self.basic_statistics() self.visualize_keyword_performance() self.visualize_post_time() self.generate_tag_wordcloud() print("所有分析已完成,结果已保存为图片文件") # 使用方法 if __name__ == "__main__": # 替换为实际的CSV文件名 analyzer = MakeupNotesAnalyzer("makeup_notes_20230715_143022.csv") analyzer.run_all_analysis()

成果评估

  1. 数据成果:成功采集500条美妆类笔记数据,涵盖5个细分品类,包含标题、互动数据、标签等12个维度信息。

  2. 分析发现

    • "口红推荐"类笔记平均点赞数最高,达到823,说明用户对产品推荐类内容兴趣浓厚
    • 美妆类笔记发布高峰在晚上20:00-22:00,占全天发布量的35%
    • 热门标签前三位为#美妆教程、#口红推荐、#新手化妆,反映用户对实用内容的偏好
    • 粉丝量与互动量呈正相关,但中等粉丝账号的内容互动率反而高于头部账号
  3. 商业建议

    • 针对20:00-22:00发布高峰,建议品牌在此时间段加大内容投放
    • 重点开发口红、粉底液等热门品类的测评和推荐内容
    • 与中等粉丝量的美妆博主合作,可能获得更高的投入产出比
    • 结合热门标签策划内容,提高笔记曝光率

扩展学习资源

  1. 官方文档:docs/

  2. 示例代码:example/

  3. 测试用例:tests/

通过以上5大核心策略和实战案例,你已经掌握了小红书数据采集的关键技能。记住,技术是工具,伦理是底线,始终在合法合规的前提下进行数据采集和分析,让数据为你创造价值的同时,也尊重平台规则和用户隐私。

【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址: https://gitcode.com/gh_mirrors/xh/xhs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 6:17:27

GLM-4-9B-Chat-1M入门必看:开源大模型+1M上下文+Chainlit交互三合一教程

GLM-4-9B-Chat-1M入门必看&#xff1a;开源大模型1M上下文Chainlit交互三合一教程 你是不是也遇到过这些情况&#xff1a; 想用一个真正开源、能本地跑的大模型&#xff0c;但发现要么太慢、要么功能单薄&#xff1b; 想处理超长文档——比如整本PDF技术手册、几十页合同、上百…

作者头像 李华
网站建设 2026/4/16 14:12:33

基于MusePublic的.NET应用开发:智能文档处理系统

基于MusePublic的.NET应用开发&#xff1a;智能文档处理系统 1. 为什么企业文档处理总让人头疼 上周帮一家做招投标服务的客户看系统瓶颈&#xff0c;他们每天要处理三百多份PDF格式的投标文件。每份文件平均30页&#xff0c;包含技术方案、资质证明、报价单等不同类型的材料…

作者头像 李华
网站建设 2026/4/15 15:02:47

基于STM32CubeMX的EasyAnimateV5-7b-zh-InP嵌入式部署方案

基于STM32CubeMX的EasyAnimateV5-7b-zh-InP嵌入式部署方案 1. 边缘视频生成的新可能&#xff1a;当大模型遇见嵌入式系统 最近在调试一个工业视觉检测项目时&#xff0c;客户提出了一个看似矛盾的需求&#xff1a;既要实时生成高质量的检测过程动画用于操作指导&#xff0c;又…

作者头像 李华
网站建设 2026/4/15 21:41:14

如何监控Hunyuan 1.8B服务?Prometheus集成部署教程

如何监控Hunyuan 1.8B服务&#xff1f;Prometheus集成部署教程 你已经成功用vLLM部署了HY-MT1.5-1.8B翻译模型&#xff0c;并通过Chainlit搭建了前端交互界面——现在&#xff0c;当用户开始频繁调用、翻译请求量逐步上升时&#xff0c;你是否能第一时间知道&#xff1a;服务响…

作者头像 李华
网站建设 2026/4/16 13:58:48

RMBG-2.0与Git集成实战:一键部署智能抠图工作流

RMBG-2.0与Git集成实战&#xff1a;一键部署智能抠图工作流 1. 为什么团队需要自动化的抠图工作流 电商运营同事昨天发来消息&#xff1a;“这批200张新品图的背景要统一换成纯白&#xff0c;明天上午十点前必须上线。”设计组正在赶季度海报&#xff0c;AI工程师在调试新模型…

作者头像 李华