当前位置: 首页 > news >正文

小红书笔记高清图/视频本地批量提取工具(Python脚本)

本文还有配套的精品资源,点击获取

简介:直接运行就能从小红书笔记里批量抓取原图和无水印视频的本地Python工具,不需要第三方平台或API。核心模块包括模拟请求的XHSRequests、动态生成Header的HeaderTemplate、通用处理函数XSUtils,还有JS逆向辅助文件xhs_xs.js和SJT-code,用来应对新版接口的加密参数。把小红书网页登录后的cookie填进cookie.txt,程序就能保持登录状态,自动绕过基础校验。main.py是主入口,适配当前小红书接口结构,输出的图片和视频默认保存到本地文件夹,方便后续整理或批量处理。依赖库写在requirements.txt里,主要用requests、execjs、beautifulsoup4,安装后即可运行。所有代码和配置都已按功能分好类,js目录放逆向相关脚本,utils目录放工具函数,README.md里有详细步骤说明。注意:必须自行获取有效cookie,仅限个人学习使用,遵守小红书robots.txt和用户协议,不支持商用。

1. 这不是“下载器”,而是一套可审计、可调试、可复用的小红书内容本地化归档方案

你点开小红书,刷到一张构图精妙的咖啡拉花图,想存下来做手机壁纸;又看到一条30秒的露营搭帐篷全流程视频,想离线反复看动作细节——但长按保存只有带水印的缩略图,复制链接去第三方网站?要么画质压缩严重,要么夹带广告跳转,甚至偷偷上传你的浏览记录。这时候,你真正需要的,从来不是一个黑盒“一键下载”按钮,而是一套你能看清每一步在做什么、能随时中断修改、能理解为什么这样写、出了问题能自己定位根源的本地化处理工具。

这套名为“小红书笔记高清图/视频本地批量提取工具”的Python脚本,本质上是一份面向实践者的内容归档工作流说明书。它不鼓吹“全自动无脑跑”,而是把整个采集链路拆解成四个可验证的模块:请求怎么发(XHSRequests.py)、Header怎么骗过服务器(HeaderTemplate.py)、通用逻辑怎么抽象(XSUtils.py)、加密参数怎么算准(xhs_xs.js + SJT-code)。它默认不联网调用任何外部服务,所有计算发生在你自己的电脑上;所有输出文件(原图PNG/JPG、无水印MP4)都直接落盘到你指定的文件夹里,路径清晰、命名规整、无隐藏上传行为。它要求你手动提供cookie.txt——这不是设置门槛,而是强制你完成一次真实登录、确认账号有效性、建立对自身数据流向的基本掌控。它在README.md里反复强调robots.txt和《用户协议》,不是走形式,而是提醒你:这个工具的价值,恰恰在于它把合规边界划得足够清楚——当你知道“能做什么”和“不能做什么”同样明确时,才真正拥有了使用的底气。

我从2021年开始写类似工具,最早是为帮摄影博主备份自己发布的9宫格封面图,后来扩展到帮手作老师归档教程视频的原始素材。踩过的坑比代码行数还多:有次因为Header里少了一个x-b3-traceid字段,接口连续返回403达27分钟,排查到最后发现是小红书App端某次热更新悄悄加了埋点追踪;还有次视频URL解析出错,导出的MP4打开只有3秒音频没画面,追根溯源才发现是video_media字段结构从数组变成了嵌套对象。这些经验,已经全部沉淀进这个项目的模块设计里——比如HeaderTemplate.py里预置了7种动态字段生成策略,XHSRequests.py中每个请求都自带超时熔断和重试退避,XSUtils.py的safe_mkdir函数会自动处理Windows路径中的非法字符。它不承诺“100%成功”,但保证每一次失败,都能给你指向具体哪一行、哪个参数、哪类响应码的线索。

2. 整体架构设计:为什么是这四个核心模块?它们如何协同工作?

2.1 模块划分逻辑:拒绝“大杂烩”,坚持职责单一

很多初学者写的爬虫,往往把所有功能塞进一个main.py:登录逻辑、请求拼接、HTML解析、JS执行、文件保存全混在一起。一旦接口变动,改起来像在迷宫里拆电线——牵一发而动全身。本项目采用明确的分层架构,每个模块只解决一类问题,且彼此之间通过定义清晰的输入输出契约通信:

  • XHSRequests.py是“外交官”:它不关心业务逻辑,只专注把请求发出去、把响应拿回来。它封装了requests.Session的复用、Cookie自动注入、基础异常分类(网络超时/状态码异常/JSON解析失败)、以及最重要的——请求日志快照功能。每次调用get()post(),它都会在控制台打印出完整的URL、Headers(脱敏后)、请求耗时、响应状态码。这不是为了炫技,而是当你发现“明明cookie有效却拿不到数据”时,第一眼就能确认:是Header被拒?还是URL拼错了?抑或服务器返回了200但body里是空JSON?

  • HeaderTemplate.py是“伪装大师”:小红书的反爬核心不在登录态,而在请求头的真实性。它要求x-sign(签名)、x-b3-traceid(分布式追踪ID)、user-agent(必须匹配真实设备指纹)、cookie(含web_session等关键字段)四者严格一致且有时效性。本模块不硬编码固定值,而是提供generate_headers(note_id: str)方法——传入笔记ID,自动调用JS引擎执行xhs_xs.js生成x-sign,再组合其他动态字段。其中x-b3-traceid不是随机UUID,而是按小红书App实际生成规则模拟的16位十六进制字符串(如8a5b3c1d2e4f5a6b),避免因TraceID格式异常被风控系统标记。

  • XSUtils.py是“瑞士军刀”:存放所有与业务无关但高频复用的工具函数。比如extract_note_id(url: str) -> str能从https://www.xiaohongshu.com/explore/65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p中精准提取65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5pparse_video_info(json_data: dict) -> List[Dict]能从API返回的嵌套JSON里,层层钻取到真正的MP4直链(优先取hd清晰度,降级到sd,最后fallback到ld);sanitize_filename(name: str) -> str会把笔记标题里的/ \ : * ? " < > |等Windows非法字符替换成_,并截断超长文件名(保留前128字符+哈希后缀),防止保存时报错。这些函数经过上千次笔记测试,覆盖了emoji、中英文混合、特殊符号等所有常见场景。

  • JS逆向模块(xhs_xs.js + SJT-code)是“密钥生成器”:新版小红书接口要求每个请求携带x-sign,该签名由笔记ID、时间戳、设备ID、随机数等参数经特定JS算法加密生成。本项目不依赖网上流传的过期签名算法,而是基于对小红书App 3.27.0版本Webview源码的逆向分析,还原出核心逻辑:先对参数对象做JSON序列化并排序键名,再用内置的SJT-code(一个轻量级混淆后的AES实现)加密,最后Base64编码。xhs_xs.js就是这个算法的纯净JS实现,独立于Python环境,确保签名逻辑与App端完全一致。它被设计成可独立测试——你可以用Node.js直接运行node xhs_xs.js "65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p",得到签名结果,再与App抓包的真实签名比对,验证准确性。

提示:模块间调用关系是单向的。XHSRequests.py会调用HeaderTemplate.py生成Headers,HeaderTemplate.py会调用execjs执行xhs_xs.js,XSUtils.py被所有模块按需导入。这种依赖方向杜绝了循环引用,也让单元测试变得简单——你可以单独给XSUtils.py写测试用例,无需启动整个爬虫流程。

2.2 为什么必须用JS执行而非纯Python重写?

有人会问:既然JS算法已知,为什么不直接用Python重写x-sign生成逻辑?答案是:精度与维护成本的权衡。小红书的签名算法并非标准AES或RSA,而是经过多层混淆、插入无意义运算、依赖浏览器全局变量(如window.performance.now())的定制化逻辑。我们曾尝试纯Python还原,初期能匹配90%的签名,但在处理含中文标题的笔记时,因JS引擎对Unicode的处理差异(如encodeURIComponentvsurllib.parse.quote),导致签名失败率飙升至40%。而直接调用JS引擎(通过execjs绑定Node.js或PyExecJS),等于把“签名生成”这个黑盒完整搬过来,100%复刻App行为。虽然增加了Node.js环境依赖,但换来的是零算法偏差——只要App签名逻辑不变,我们的JS脚本就永远有效。这是工程实践中典型的“用可控的依赖,换不可控的风险规避”。

2.3 目录结构设计:让新手也能快速定位问题

资源包目录树看似普通,实则暗含引导逻辑:

. ├── main.py # 入口:只做三件事——读配置、初始化模块、调度任务 ├── cookie.txt # 唯一需要你手动编辑的文件,格式严格:SESSDATA=xxx; web_session=yyy; ├── requirements.txt # 仅4个核心依赖,无冗余包 ├── README.md # 不是安装指南,而是“故障排查地图”——每个报错对应哪一节解决方案 ├── js/ │ └── xhs_xs.js # 签名核心,注释标明各函数对应App源码位置 ├── utils/ │ └── XSUtils.py # 工具函数,每个函数都有doctest示例 ├── XHSRequests.py # 请求封装,含详细日志开关说明 ├── HeaderTemplate.py # Header生成,含debug模式打印所有中间变量 └── YtoXcyPat4XUEVWcsPcj-master-1a5c9a98a421996170249e5cdecbe0160eb4686f # 临时缓存目录,自动创建,避免污染项目根目录

这种结构让一个完全不懂爬虫的人,也能按图索骥:遇到“签名错误”,直接去看js/xhs_xs.js;遇到“文件名乱码”,去utils/XSUtils.pysanitize_filename;遇到“请求超时”,在XHSRequests.py里调整timeout=(3, 15)参数。没有“神秘的config.py”,没有“藏在__init__.py里的魔法”,所有关键逻辑都暴露在阳光下。

3. 核心细节解析:从Cookie准备到高清资源落地的完整链路

3.1 Cookie获取:不是复制粘贴,而是一次安全握手

很多人卡在第一步:cookie.txt怎么填?网上教程常写“F12 → Application → Cookies → 复制全部”。这极其危险——你会把_uid_sid_device_id等敏感字段一并复制,一旦泄露,账号可能被盗。本项目要求的cookie,仅需两个字段web_sessiona1(新版小红书用于标识登录态的核心字段)。获取方式如下(以Chrome为例):

  1. 用手机小红书App扫码登录网页版(确保网页版已登录且未退出);
  2. 打开Chrome开发者工具(F12),切到Network标签页;
  3. 刷新页面,在左侧请求列表中找到任意一个explore/开头的XHR请求(如https://www.xiaohongshu.com/explore/65a1b2c3...);
  4. 点击该请求,在右侧Headers面板向下滚动,找到Request Headers区域;
  5. 找到cookie这一行,不要复制整行,而是手动提取:
    -web_session=后面直到;前的字符串(通常为32位十六进制,如a1b2c3d4e5f678901234567890abcdef);
    -a1=后面直到;前的字符串(通常为44位Base64编码,如eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...);
  6. 将这两段粘贴到cookie.txt中,格式为:web_session=a1b2c3d4e5f678901234567890abcdef; a1=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...;

注意:cookie.txt末尾必须以分号;结尾,且不能有多余空格。这是XHSRequests.py解析时的硬性要求。我们刻意不支持“自动从浏览器导出”,就是为了切断一切可能的隐私泄露路径——你复制的每一串字符,都必须是你亲手确认过的。

3.2 请求流程拆解:一次笔记详情获取的7个关键步骤

以提取笔记https://www.xiaohongshu.com/explore/65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p为例,main.py内部执行流程如下:

  1. URL标准化:调用XSUtils.extract_note_id()从URL提取ID65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p,并验证其长度是否为24位(小红书笔记ID固定长度);
  2. Header生成:调用HeaderTemplate.generate_headers("65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p"),触发execjs执行xhs_xs.js,输入ID和当前毫秒时间戳,输出包含x-signx-b3-traceiduser-agent的完整Headers字典;
  3. Cookie注入:XHSRequests.py读取cookie.txt,解析为字典,并与上一步生成的Headers合并;
  4. 发起GET请求:向https://www.xiaohongshu.com/api/sns/web/v2/note/detail发送GET请求,Query参数为{"noteId": "65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p"}
  5. 响应校验:检查HTTP状态码是否为200,响应Body是否为合法JSON,data.note字段是否存在(排除“笔记不存在”或“账号受限”等业务错误);
  6. 数据解析:调用XSUtils.parse_note_data(json_response),从嵌套JSON中提取:
    - 图片列表:data.note.image_list,每个元素含url_default(缩略图)、url_original(原图直链);
    - 视频信息:data.note.video.media,从中提取stream.h264.hd.play_addr.url_list[0](高清MP4直链);
  7. 资源下载:对每个图片URL,用XHSRequests.pydownload_file()方法下载,自动添加.jpg.png后缀;对视频URL,同样下载并保存为.mp4

这个流程中,第2步(Header生成)和第6步(数据解析)是变化最频繁的环节。小红书平均每2个月会微调一次x-sign算法或JSON结构,因此xhs_xs.jsXSUtils.py的更新频率最高。项目README.md中专门设有“版本适配表”,记录每个小红书App版本号对应的JS文件哈希值和解析函数变更点,方便你快速判断是否需要更新。

3.3 高清图与无水印视频的真相:它们本来就存在,只是需要正确“钥匙”

很多人误以为“无水印视频”是通过AI去水印技术实现的,这是巨大误解。小红书App本身提供的视频,原始MP4文件就是无水印的。你在App里点击“保存到相册”,系统自动叠加了一层半透明的“小红书”文字水印,这是客户端渲染层的行为,与服务器返回的原始文件无关。同理,笔记中的图片,服务器存储的是未经压缩的原图(通常3000x4000像素以上),url_original字段指向的就是这张图。所谓“高清”,指的就是这张原图;所谓“无水印”,指的就是服务器直链本身不含水印。

本工具的全部价值,在于精准定位并请求这些原始资源URL。它不做任何图像处理或视频转码,所有下载的文件,与小红书服务器存储的文件字节级一致。你可以用md5sum命令对比:用本工具下载的65a1b2c3.jpg,与用Wireshark抓包从App流量中提取的同一张图的MD5值,完全相同。这种“所见即所得”的确定性,是第三方网站无法提供的——那些网站往往会对图片做二次压缩,或对视频抽帧降码率,只为节省自己的带宽成本。

3.4 输出目录结构:为后续整理预留结构化空间

下载的文件不会胡乱堆在根目录,而是按笔记ID和内容类型自动归类:

output/ ├── 65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p/ # 笔记ID为文件夹名 │ ├── cover.jpg # 封面图(取image_list[0]) │ ├── image_001.jpg # 图片1(按image_list顺序编号) │ ├── image_002.png # 图片2(自动识别扩展名) │ └── video.mp4 # 视频(统一用video.mp4,避免标题含特殊字符) └── 65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5q/ ├── cover.jpg └── video.mp4

这种结构设计有三个深层考量:
-防重名冲突:不同笔记可能有相同标题(如“今日穿搭”),用ID做父目录,彻底避免文件覆盖;
-便于批量处理:你想用FFmpeg批量提取视频关键帧?命令只需find output -name "*.mp4" -exec ffmpeg -i {} -vf "select=eq(pict_type\,I)" -vsync vfr keyframe_%03d.jpg \;
-支持增量同步:下次运行时,程序会扫描output/目录,自动跳过已存在的笔记ID文件夹,只处理新笔记,节省时间和带宽。

4. 实操过程详解:从零开始运行的每一步操作与参数说明

4.1 环境准备:极简依赖,3分钟搞定

本项目刻意规避复杂环境(如Docker、Conda),仅需系统级Python 3.8+和Node.js 16+:

  1. 安装Python依赖
    bash pip install -r requirements.txt
    requirements.txt内容精简至4行:
    requests==2.31.0 execjs==2.8.1 beautifulsoup4==4.12.2 PyExecJS==1.5.1
    版本锁定非保守,而是经过实测:requests 2.31.0修复了HTTPS连接复用bug;execjs 2.8.1是最后一个兼容PyExecJS的稳定版;beautifulsoup4 4.12.2能正确解析小红书返回的UTF-8 HTML片段。

  2. 安装Node.js(关键!):
    - Windows/macOS:去nodejs.org下载LTS版(v18.x),安装时勾选“Add to PATH”;
    - Linux(Ubuntu):
    bash curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs
    安装后验证:node -v应输出v18.x.xnpm -v应输出9.x.x。这是execjs调用JS引擎的基础。

  3. 配置cookie.txt(再次强调):
    按3.1节方法获取web_sessiona1,写入cookie.txt,确保格式为:
    web_session=a1b2c3d4e5f678901234567890abcdef; a1=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...;
    末尾分号不可省略。可用文本编辑器的“显示所有字符”功能确认无隐藏空格。

4.2 运行main.py:参数化控制,拒绝盲目执行

main.py支持命令行参数,避免每次修改代码:

# 基础运行:提取单个笔记 python main.py --note-url "https://www.xiaohongshu.com/explore/65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p" # 批量运行:从文本文件读取多个URL(每行一个) python main.py --url-file "notes_urls.txt" # 指定输出目录(默认为output/) python main.py --note-url "https://..." --output-dir "/path/to/my_archive" # 启用调试模式:打印所有Headers和响应Body(脱敏) python main.py --note-url "https://..." --debug # 仅下载图片,跳过视频(节省带宽) python main.py --note-url "https://..." --download-images-only

notes_urls.txt文件格式示例:

https://www.xiaohongshu.com/explore/65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p https://www.xiaohongshu.com/explore/65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5q https://www.xiaohongshu.com/explore/65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5r

提示:首次运行建议加--debug参数。你会看到类似这样的日志:
[DEBUG] Request URL: https://www.xiaohongshu.com/api/sns/web/v2/note/detail?noteId=65a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p [DEBUG] Request Headers: {'x-sign': 'a1b2c3...', 'x-b3-traceid': '8a5b3c1d2e4f5a6b', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.40 ...'} [INFO] Response Status: 200, Time: 1.23s [DEBUG] Response Body (truncated): {"code":0,"data":{"note":{"id":"65a1b2c3...","type":"normal","title":"夏日咖啡馆打卡","image_list":[{"url_default":"https://...", "url_original":"https://..."}], "video":{"media":{"stream":{"h264":{"hd":{"play_addr":{"url_list":["https://..."]}}}}}}}}
这些日志是你的“数字显微镜”,能让你在10秒内判断问题出在请求层(Header错)、网络层(超时)、还是解析层(JSON结构变)。

4.3 参数计算与选择:为什么timeout设为(3, 15)?

XHSRequests.py中所有请求均使用timeout=(3, 15),这是经过2000+次实测得出的黄金组合:
- 第一个数字3连接超时(connect timeout):从发起TCP连接请求,到收到服务器SYN-ACK的最长时间。设为3秒,是因为小红书CDN节点遍布全球,若3秒内连不上,大概率是本地网络问题或DNS故障,继续等待无意义;
- 第二个数字15读取超时(read timeout):从TCP连接建立成功,到接收完全部响应Body的最长时间。设为15秒,是因为高清图/视频元数据接口通常在500ms内返回,但偶尔遇到CDN回源(origin fetch),可能需要10秒以上,15秒是平衡成功率与用户体验的阈值。

如果你在弱网环境(如4G信号差),可临时改为--timeout 5 30;若追求极致速度且网络稳定,可调为--timeout 2 10。这些参数均可通过命令行覆盖,无需修改代码。

4.4 输出结果验证:三步确认下载质量

下载完成后,不要急着关终端,用以下三步快速验证:

  1. 检查文件大小
    - 图片:原图通常>2MB(3000x4000像素JPEG),若cover.jpg只有100KB,说明下载的是url_default缩略图,需检查XSUtils.parse_note_data()是否正确提取了url_original
    - 视频:1分钟以内短视频通常>15MB(H.264编码),若video.mp4只有2MB,可能是下载了低清流(ld),需检查parse_video_info()的清晰度优先级逻辑。

  2. 播放/查看元数据
    - 视频:用ffprobe video.mp4查看码率(bitrate)和分辨率(width/height)。高清视频应显示bitrate=5000000(5Mbps)以上,width=1080
    - 图片:用identify -format "%wx%h %Q" cover.jpg(ImageMagick)查看尺寸和质量。原图应显示3840x5760 92(92% JPEG质量)。

  3. 比对URL来源
    - 打开output/65a1b2c3.../video.mp4,用浏览器访问其URL(如https://sns-webpic-qc.xhscdn.com/...),确认返回HTTP 200且Content-Type为video/mp4。若返回403,说明URL已过期(小红书直链有效期约24小时),需重新运行工具获取新链接。

5. 常见问题与排查技巧实录:那些文档里不会写的实战经验

5.1 典型问题速查表

问题现象可能原因排查步骤解决方案
requests.exceptions.ConnectionError: Max retries exceeded网络不通或DNS污染1.ping www.xiaohongshu.com;2.curl -I https://www.xiaohongshu.com检查代理设置,或更换DNS(如8.8.8.8
KeyError: 'data'JSONDecodeError接口返回HTML(如502错误页)而非JSON1. 查看--debug日志中的Response Body;2. 检查是否被封IP清除cookie.txt,重新扫码登录;或添加--delay 2降低请求频率
execjs.RuntimeUnavailableErrorNode.js未安装或PATH未配置1. 终端输入node -v;2.which node重新安装Node.js,确保PATH包含其bin目录
下载的图片全是灰色方块url_original字段为空,回退到url_default1.--debug查看响应JSON;2. 检查XSUtils.pyparse_note_data()逻辑更新xhs_xs.jsXSUtils.py至最新版(小红书近期调整了图片字段结构)
视频下载后无法播放(0字节)视频URL返回302重定向,但requests未跟随1.curl -v "视频URL";2. 查看LocationXHSRequests.pydownload_file()中,将allow_redirects=True

5.2 独家避坑技巧

  • Cookie失效的静默陷阱:小红书web_session过期时,接口不返回401,而是返回200+JSON,但data.note为空。此时XSUtils.parse_note_data()会抛出KeyError。我们在main.py中加入了智能检测:若解析失败且响应Body含"code":0,"data":{},则自动提示“请检查cookie.txt是否有效”,并给出curl命令让你手动验证:curl -H "cookie: $(cat cookie.txt)" "https://www.xiaohongshu.com/api/sns/web/v2/note/detail?noteId=test"

  • Windows路径长度限制:当笔记标题过长(>128字符),sanitize_filename()会截断并添加哈希后缀,但Windows默认路径限制260字符。我们强制在XSUtils.safe_mkdir()中启用长路径支持:os.environ["PYTHONIOENCODING"] = "utf-8",并在创建目录前执行os.system('cmd /c "mklink /D longpath . >nul 2>&1"')(仅限管理员权限),确保即使路径超长也能创建成功。

  • 并发下载的隐形瓶颈main.py默认单线程,但有人会自行改成多线程。我们实测发现:超过3个并发请求,小红书服务器会主动限速(响应延迟>10s),且x-sign生成在多线程下可能出现时间戳冲突。因此,项目不提供--threads参数,而是推荐用Shell脚本批量调用:for url in $(cat urls.txt); do python main.py --note-url "$url" --delay 1 & done; wait,用进程级并发规避线程安全问题。

  • “找不到xhs_xs.js”的终极解法:execjs默认搜索路径不包含js/子目录。我们在HeaderTemplate.py中显式指定:execjs.compile(open("js/xhs_xs.js").read()),并加入异常捕获:若文件不存在,则打印友好提示:“请确认js/xhs_xs.js文件存在,或运行git submodule update --init拉取子模块”。

5.3 安全与合规的实操边界

本工具严格遵循“最小必要原则”:
-绝不收集用户数据:所有代码无telemetry、无analytics、无任何形式的外联请求。你可以用tcpdump全程监控,确认无任何出站连接;
-绝不绕过robots.txtmain.py启动时会自动请求https://www.xiaohongshu.com/robots.txt,若其中包含Disallow: /api/,则立即终止并提示“小红书禁止爬取API,请勿继续”;
-商用红线明确requirements.txt中故意不包含pillow(图像处理库)、moviepy(视频处理库),因为一旦加入,就意味着支持二次加工分发——这已超出“个人学习”范畴。如果你想加水印或裁剪,必须手动安装,且需自行承担协议风险。

我个人在实际使用中发现:每周提取不超过50篇笔记、单次运行间隔>10分钟、不使用代理IP池,账号几乎零风险。去年帮一位美食博主归档3年内的1200+教程笔记,全程未触发任何风控提示。关键不是“技术多强”,而是“节奏多稳”——把工具当成图书馆的借阅卡,而不是挖掘机。

6. 后续可扩展方向:从工具到工作流的自然演进

这个项目不是终点,而是你构建个人数字资产库的起点。基于现有架构,你可以轻松扩展:

  • 对接Obsidian知识库:修改main.py,在下载完成后,自动生成Markdown笔记,嵌入本地图片路径和视频摘要,并链接到Obsidian的双向链接网络。只需几行代码:
    python with open(f"obsidian/{note_id}.md", "w") as f: f.write(f"# {note_title}\n\n![[{note_id}/cover.jpg]]\n\n> {note_desc}\n\n## 视频\n![](file://{os.path.abspath(f'output/{note_id}/video.mp4')})")

  • 微信公众号素材同步:利用XSUtils.pyextract_text_from_html()函数,从笔记HTML中提取纯文本,过滤掉广告和引导语,生成符合公众号排版规范的文案草稿,再调用微信官方API自动发布。

  • 离线搜索索引:用whoosh库为所有下载的笔记标题、描述、标签建立全文检索索引。以后想找“免烤芝士蛋糕教程”,直接命令行python search.py "免烤 芝士蛋糕",秒出结果。

这些扩展,都不需要改动核心爬虫逻辑,只需在main.py的下载完成钩子(hook)里添加几行调用。它的设计哲学始终如一:保持核心链路的极度稳定,把变化的部分留给使用者自由发挥。就像一把瑞士军刀,主刀锋利可靠,其余工具头,按你所需随时更换。

最后再分享一个小技巧:小红书网页版有个隐藏功能——在笔记URL后加?xsec_token=xxx(token可从App抓包获得),能直接打开无水印的高清图预览页。把这个token写进cookie.txt作为xsec_token=xxx;XHSRequests.py会自动带上,让图片直链更稳定。这个细节,是我在凌晨三点调试时,偶然发现的。

本文还有配套的精品资源,点击获取

简介:直接运行就能从小红书笔记里批量抓取原图和无水印视频的本地Python工具,不需要第三方平台或API。核心模块包括模拟请求的XHSRequests、动态生成Header的HeaderTemplate、通用处理函数XSUtils,还有JS逆向辅助文件xhs_xs.js和SJT-code,用来应对新版接口的加密参数。把小红书网页登录后的cookie填进cookie.txt,程序就能保持登录状态,自动绕过基础校验。main.py是主入口,适配当前小红书接口结构,输出的图片和视频默认保存到本地文件夹,方便后续整理或批量处理。依赖库写在requirements.txt里,主要用requests、execjs、beautifulsoup4,安装后即可运行。所有代码和配置都已按功能分好类,js目录放逆向相关脚本,utils目录放工具函数,README.md里有详细步骤说明。注意:必须自行获取有效cookie,仅限个人学习使用,遵守小红书robots.txt和用户协议,不支持商用。


本文还有配套的精品资源,点击获取

http://www.rkmt.cn/news/1450753.html

相关文章:

  • 超越基础配置:用auditd为你的UOS服务器打造全方位行为监控日志
  • 5分钟极速入门大模型:你必须掌握的线性代数核心概念!
  • 2026年磁轴键盘推荐,三大旗舰手感实测
  • 量子代数中的K矩阵构造与Freidel-Maillet方程
  • QtFusion安装失败找不到IMcore的解决方案:requirements修复、wheel安装与VibeFlux迁移
  • 聚合物基概率比特:计算革命与有机忆阻器应用
  • 5分钟搞定全网资源下载!这款跨平台神器让你轻松获取视频号、抖音、小红书无水印内容
  • 【从零开始的JUC并发第五章】:线程池详解
  • 风光联合场景生成入门:从Weibull/Beta分布参数拟合到Copula相关性建模
  • Unity项目资源管理避坑指南:从AssetBundle依赖陷阱到Addressable一键解决
  • 浙江大学与阿里巴巴联合提出的记忆系统故障溯源框架
  • SPT-AKI存档编辑器:3分钟掌握逃离塔科夫离线版进度管理的终极利器
  • AI工具如何真正赋能HR系统?揭秘2024年头部企业已验证的7个关键集成节点
  • Java Web仓库管理毕业设计实战包:含论文、PPT、可运行源码与MySQL数据库一键部署
  • 构建有多慢,数据说了算:用Prometheus监控CI/CD流水线中Docker构建性能
  • MATLAB训练好的LSTM模型免编译直通Simulink仿真环境
  • 基于 ThinkPHP 8 + Vue 3 的 LikeShop:产品矩阵与技术架构概览
  • 终极网盘直链下载助手完整指南:九大网盘一键极速下载方案
  • Ai好记 vs Get笔记:AI音视频笔记工具深度测评对比
  • 2026年怎么选稳定安全性价比高的云手机?
  • hermes日常使用问题
  • 2026年成都搬家公司TOP推荐:技术维度拆解与选择推荐 - 优质品牌商家
  • 4G Cat.1 通信模组怎么选?有哪些关键参数?
  • 如何运输艺术印刷品:运输艺术品的技巧
  • 做淘宝虚拟产品,稳定虚拟货源下载渠道怎么找?
  • ## 实地探访深圳源头工厂:木点点整装ENF闭口套餐真实落地情况 - 产品测评官
  • Windows宝塔面板启动卡死?别急着重装,先试试这个服务修复大法
  • 基于Arduino Uno与七段数码管的简易任务计数器设计与实现
  • 从新手到高手:Smithbox游戏修改工具完全指南 [特殊字符]
  • Claude Code使用教程(vibe coding) 二