# XHS-Downloader **Repository Path**: anydev/XHS-Downloader ## Basic Information - **Project Name**: XHS-Downloader - **Description**: 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接;采集小红书作品信息;提取小红书作品下载地址;下载小红书无水印作品文件 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-16 - **Last Updated**: 2025-08-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python ## README
🔥 小红书链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品链接、用户链接;采集小红书作品信息;提取小红书作品下载地址;下载小红书无水印作品文件!
🔥 “小红书”、“XiaoHongShu”、“RedNote” 含义相同,本项目统称为 “小红书”
前往 bilibili 观看演示;前往 YouTube 观看演示
https://www.xiaohongshu.com/explore/作品ID?xsec_token=XXXhttps://www.xiaohongshu.com/discovery/item/作品ID?xsec_token=XXXhttps://www.xiaohongshu.com/user/profile/作者ID/作品ID?xsec_token=XXXhttps://xhslink.com/分享码支持单次输入多个作品链接,链接之间使用空格分隔;程序会自动提取有效链接,无需额外处理!
⭐ 推荐使用 Windows 终端 (Windows 11 默认终端)运行程序以便获得最佳显示效果!
如果仅需下载无水印作品文件,建议选择 程序运行 或 Docker 运行;如果有其他需求,建议选择 源码运行!
2.2 版本开始,项目功能无异常的情况下,无需额外处理 Cookie!
⭐ Mac OS、Windows 10 及以上用户可前往 Releases 或者 Actions 下载程序压缩包,解压后打开程序文件夹,双击运行 main 即可使用。
⭐ 本项目包含自动构建可执行文件的 GitHub Actions,使用者可以随时使用 GitHub Actions 将最新源码构建为可执行文件!
⭐ 自动构建可执行文件教程请查阅本文档的 构建可执行文件指南 部分;如果需要更加详细的图文教程,请 查阅文章!
注意:Mac OS 平台可执行文件 main 可能需要从终端命令行启动;受设备限制,Mac OS 平台可执行文件尚未经过测试,无法保证可用性!
若通过此方式使用程序,文件默认下载路径为:.\_internal\Volume\Download;配置文件路径为:.\_internal\Volume\settings.json
方案一:下载并解压文件,将旧版本的 _internal\Volume 文件夹复制到新版本的 _internal 文件夹。
方案二:下载并解压文件(不要运行程序),复制全部文件,直接覆盖旧版本文件。
Dockerfile 文件构建镜像docker pull joeanamier/xhs-downloader 命令拉取镜像docker pull ghcr.io/joeanamier/xhs-downloader 命令拉取镜像docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it <镜像名称>docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it <镜像名称> python main.py apidocker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it <镜像名称> python main.py mcp<镜像名称> 需与您在第一步中使用的镜像名称保持一致(joeanamier/xhs-downloader 或 ghcr.io/joeanamier/xhs-downloader)
docker start -i 容器名称/容器 IDdocker restart -i 容器名称/容器 IDDocker 运行项目时不支持 命令行调用模式,无法使用 读取剪贴板 与 监听剪贴板 功能,可以正常粘贴内容,其他功能如有异常请反馈!
3.12 的 Python 解释器3.12 的 Python 解释器pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 命令安装程序所需模块main.py 即可使用项目支持命令行运行模式,若想要下载图文作品的部分图片,可以使用此模式设置需要下载的图片序号!
注意:未设置 --index 参数时,支持传入多个作品链接,全部链接需要使用引号包围,链接之间使用空格分隔;已设置 --index 参数时,不支持传入多个作品链接,即使传入多个作品链接,程序仅处理首个作品链接!
可以使用命令行 从浏览器读取 Cookie 并写入配置文件!
命令示例:python .\main.py --browser_cookie Chrome --update_settings
bool 类型参数支持使用 true、false、1、0、yes、no、on 或 off(不区分大小写)来设置。
服务器模式包含 API 模式和 MCP 模式!
启动:运行命令:python .\main.py api
关闭:按下 Ctrl + C 关闭服务器
访问 http://127.0.0.1:5556/docs 或者 http://127.0.0.1:5556/redoc;你会看到自动生成的交互式 API 文档!
请求接口:/xhs/detail
请求方法:POST
请求格式:JSON
请求参数:
| 参数 | 类型 | 含义 | 默认值 |
|---|---|---|---|
| url | str | 小红书作品链接,自动提取,不支持多链接;必需参数 | 无 |
| download | bool | 是否下载作品文件;设置为 true 将会耗费更多时间;可选参数 |
false |
| index | list[int] | 下载指定序号的图片文件,仅对图文作品生效;download 参数设置为 false 时不生效;可选参数 |
null |
| cookie | str | 请求数据时使用的 Cookie;可选参数 | 配置文件 cookie 参数 |
| proxy | str | 请求数据时使用的代理;可选参数 | 配置文件 proxy 参数 |
| skip | bool | 是否跳过存在下载记录的作品;设置为 true 将不会返回存在下载记录的作品数据;可选参数 |
false |
代码示例:
async def example_api():
"""通过 API 设置参数,适合二次开发"""
server = "http://127.0.0.1:5556/xhs/detail"
data = {
"url": "", # 必需参数
"download": True,
"index": [
3,
6,
9,
],
"proxy": "http://127.0.0.1:10808",
}
response = post(server, json=data, timeout=10)
print(response.json())
启动:运行命令:python .\main.py mcp
关闭:按下 Ctrl + C 关闭服务器
MCP URL:http://127.0.0.1:5556/mcp/
下载图文作品时可以指定需要下载的图片序号;默认不返回作品信息,如需返回作品信息,请在对话时明确表述。
./Volume/Download/ExploreData.db 文件./Volume/ExploreID.db 文件如果您的浏览器安装了 Tampermonkey 浏览器扩展程序,可以使用用户脚本体验项目功能!
用户脚本链接(右键单击复制链接):master 分支、develop 分支
提示:使用 XHS-Downloader 用户脚本批量提取作品链接,搭配 XHS-Downloader 程序可以实现批量下载无水印作品文件!
自动滚动页面功能代码已重构,该功能默认关闭!启用该功能可能会被小红书检测为自动化操作,从而导致账号受到风控或封禁风险!
如果有其他需求,可以根据 example.py 的注释提示进行代码调用或修改!
async def example():
"""通过代码设置参数,适合二次开发"""
# 示例链接
demo_link = "https://www.xiaohongshu.com/explore/XXX?xsec_token=XXX"
# 实例对象
work_path = "D:\\" # 作品数据/文件保存根路径,默认值:项目根路径
folder_name = "Download" # 作品文件储存文件夹名称(自动创建),默认值:Download
name_format = "作品标题 作品描述"
user_agent = "" # User-Agent
cookie = "" # 小红书网页版 Cookie,无需登录,可选参数,登录状态对数据采集有影响
proxy = None # 网络代理
timeout = 5 # 请求数据超时限制,单位:秒,默认值:10
chunk = 1024 * 1024 * 10 # 下载文件时,每次从服务器获取的数据块大小,单位:字节
max_retry = 2 # 请求数据失败时,重试的最大次数,单位:秒,默认值:5
record_data = False # 是否保存作品数据至文件
image_format = "WEBP" # 图文作品文件下载格式,支持:AUTO、PNG、WEBP、JPEG、HEIC
folder_mode = False # 是否将每个作品的文件储存至单独的文件夹
image_download = True # 图文、图集作品文件下载开关
video_download = True # 视频作品文件下载开关
live_download = False # 图文动图文件下载开关
download_record = True # 是否记录下载成功的作品 ID
language = "zh_CN" # 设置程序提示语言
author_archive = True # 是否将每个作者的作品存至单独的文件夹
write_mtime = True # 是否将作品文件的 修改时间 修改为作品的发布时间
read_cookie = None # 读取浏览器 Cookie,支持设置浏览器名称(字符串)或者浏览器序号(整数),设置为 None 代表不读取
# async with XHS() as xhs:
# pass # 使用默认参数
async with XHS(
work_path=work_path,
folder_name=folder_name,
name_format=name_format,
user_agent=user_agent,
cookie=cookie,
proxy=proxy,
timeout=timeout,
chunk=chunk,
max_retry=max_retry,
record_data=record_data,
image_format=image_format,
folder_mode=folder_mode,
image_download=image_download,
video_download=video_download,
live_download=live_download,
download_record=download_record,
language=language,
read_cookie=read_cookie,
author_archive=author_archive,
write_mtime=write_mtime,
) as xhs: # 使用自定义参数
download = True # 是否下载作品文件,默认值:False
# 返回作品详细信息,包括下载地址
# 获取数据失败时返回空字典
print(
await xhs.extract(
demo_link,
download,
index=[
1,
2,
5,
],
)
)
项目使用 pyperclip 实现读取剪贴板功能,该模块在不同的系统上会有差异。
在 Windows 上,不需要额外的模块。
在 Mac 上,该模块使用 pbcopy 和 pbpaste 命令,这些命令应该随操作系统一起提供。
在 Linux 上,该模块使用 xclip 或 xsel 命令,这些命令应该随操作系统一起提供。否则,请运行 "sudo apt-get install xclip" 或 "sudo apt-get install xsel"(注意:xsel 似乎并不总是有效)
在其他 Linux 系统上,你需要安装 qtpy 或 PyQT5 模块。
项目根目录下的 settings.json 文件,首次运行自动生成,可以自定义部分运行参数。
如果设置了无效的参数值,程序将会使用参数默认值!
| 参数 | 类型 | 含义 | 默认值 |
|---|---|---|---|
| mapping_data | str: str | #作者别名映射表,格式:作者ID: 作者别名 |
无 |
| work_path | str | 作品数据 / 文件保存根路径 | 项目根路径/Volume |
| folder_name | str | 作品文件储存文件夹名称 | Download |
| name_format | str | 作品文件名称格式,字段之间使用空格分隔,支持字段:收藏数量、评论数量、分享数量、点赞数量、作品标签、作品ID、作品标题、作品描述、作品类型、发布时间、最后更新时间、作者昵称、作者ID |
发布时间 作者昵称 作品标题 |
| user_agent | str | 浏览器 User Agent | 内置 Chrome User Agent |
| cookie | str | 小红书网页版 Cookie,无需登录,非必需参数! | 无 |
| proxy | str | 设置程序代理 | null |
| timeout | int | 请求数据超时限制,单位:秒 | 10 |
| chunk | int | 下载文件时,每次从服务器获取的数据块大小,单位:字节 | 2097152(2 MB) |
| max_retry | int | 请求数据失败时,重试的最大次数,单位:秒 | 5 |
| record_data | bool | 是否保存作品数据至文件,保存格式:SQLite |
false |
| image_format | str | 图文作品文件下载格式,支持:AUTO、PNG、WEBP、JPEG、HEIC部分作品没有 HEIC 格式的文件,此时下载的文件可能为 WEBP 格式!设置为 AUTO 时表示动态格式,实际格式取决于服务器响应数据! |
PNG |
| image_download | bool | 图文、图集作品文件下载开关 | true |
| video_download | bool | 视频作品文件下载开关 | true |
| live_download | bool | 图文动图文件下载开关 | false |
| folder_mode | bool | 是否将每个作品的文件储存至单独的文件夹;文件夹名称与文件名称保持一致 | false |
| download_record | bool | 是否记录下载成功的作品 ID,如果开启,程序将会自动跳过下载存在记录的作品 | true |
| author_archive | bool | #是否将每个作者的作品储存至单独的文件夹;文件夹名称为 作者ID_作者昵称 |
false |
| write_mtime | bool | 是否将作品文件的 修改时间 属性修改为作品的发布时间 |
false |
| language | str | 设置程序语言,目前支持:zh_CN、en_US |
zh_CN |
其他说明:user_agent参数获取示例;强烈建议根据实际浏览器信息进行设置!
2.2 版本开始,项目功能无异常的情况下,无需额外处理 Cookie!
https://www.xiaohongshu.com/exploreF12 打开开发人员工具网络 选项卡保留日志过滤 输入框输入 cookie-name:web_sessionFetch/XHR 筛选器网络 选项卡选择任意数据包(如果无数据包,重复步骤7)
XHS-Downloader 会将下载过的作品 ID 储存至数据库,当重复下载相同的作品时,XHS-Downloader 会自动跳过该作品的文件下载(即使作品文件不存在),如果想要重新下载作品文件,请先删除数据库中对应的作品 ID,再使用 XHS-Downloader 下载作品文件!
该功能默认开启,如果关闭该功能,XHS-Downloader 会检查文件是否存在,若文件存在则跳过下载!
如果 XHS-Downloader 对您有帮助,请考虑为它点个 Star ⭐,感谢您的支持!
| 微信(WeChat) | 支付宝(Alipay) |
|---|---|
![]() |
![]() |
如果您愿意,可以考虑提供资助为 XHS-Downloader 提供额外的支持!
欢迎对本项目做出贡献!为了保持代码库的整洁、高效和易于维护,请仔细阅读以下指南,以确保您的贡献能够顺利被接受和整合。
develop 分支拉取最新的代码,以此为基础进行修改;这有助于避免合并冲突并保证您的改动基于最新的项目状态。<类型>: <简短描述>develop 分支;这是为了给维护者一个缓冲区,在最终合并到 master
分支之前进行额外的测试和审查。参考资料:
说明:QQ 群聊仅限于讨论项目使用问题,严禁发布任何广告,严禁讨论任何账号交易、账号流量、流量变现、灰色产业等相关的内容!
✨ 作者的其他开源项目:
ZMTO:一家专业的云基础设施提供商,以可靠的尖端技术与专业支持,提供高效的解决方案,并为符合条件的开源项目提供企业级VPS基础设施,支持开源生态系统的可持续发展与创新。