Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/joeanamier/xhs-downloader

小红书链接提取/作品采集工具:提取账号发布、收藏、点赞作品链接;提取搜索结果作品、用户链接;采集小红书作品信息;提取小红书作品下载地址;下载小红书无水印作品文件!
https://github.com/joeanamier/xhs-downloader

aiohttp css exe javascript json linux macos python tampermonkey textual tui userscript windows xhs

Last synced: about 2 hours ago
JSON representation

小红书链接提取/作品采集工具:提取账号发布、收藏、点赞作品链接;提取搜索结果作品、用户链接;采集小红书作品信息;提取小红书作品下载地址;下载小红书无水印作品文件!

Awesome Lists containing this project

README

        




XHS-Downloader


简体中文 | English


GitHub
GitHub forks
GitHub Repo stars
Static Badge


Static Badge
GitHub code size in bytes
GitHub release (with filter)
GitHub all releases



🔥 小红书链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品链接、用户链接;采集小红书作品信息;提取小红书作品下载地址;下载小红书无水印作品文件!


⚠️ 2024/9/24: 由于小红书规则更新,使用版本号低于 1.7.0 的用户脚本有封号风险,请及时更新用户脚本后再使用!


⭐ 本项目完全免费开源,无任何收费功能,请勿上当受骗!


📑 项目功能



    程序功能
  • ✅ 采集小红书作品信息

  • ✅ 提取小红书作品下载地址

  • ✅ 下载小红书无水印作品文件

  • ✅ 下载小红书 livePhoto 文件(非无水印)

  • ✅ 自动跳过已下载的作品文件

  • ✅ 作品文件完整性处理机制

  • ✅ 自定义图文作品文件下载格式

  • ✅ 持久化储存作品信息至文件

  • ✅ 作品文件储存至单独文件夹

  • ✅ 后台监听剪贴板下载作品

  • ✅ 记录已下载作品 ID

  • ✅ 支持命令行下载作品文件

  • ✅ 从浏览器读取 Cookie

  • ✅ 自定义文件名称格式

  • ✅ 支持 API 调用功能

  • ✅ 支持文件断点续传下载



    脚本功能
  • ✅ 下载小红书无水印作品文件

  • ✅ 提取发现页面作品链接

  • ✅ 提取账号发布作品链接

  • ✅ 提取账号收藏作品链接

  • ✅ 提取账号点赞作品链接

  • ✅ 提取账号专辑作品链接

  • ✅ 提取搜索结果作品链接

  • ✅ 提取搜索结果用户链接


⭐ XHS-Downloader 开发计划及进度可前往 Projects 查阅


📸 程序截图


🎥 点击图片观看演示视频









🔗 支持链接



  • https://www.xiaohongshu.com/explore/作品ID

  • https://www.xiaohongshu.com/explore/作品ID?xsec_token=XXX

  • https://www.xiaohongshu.com/discovery/item/作品ID

  • https://xhslink.com/分享码



  • 支持单次输入多个作品链接,链接之间使用空格分隔;程序会自动提取有效链接,无需额外处理!



🪟 关于终端


⭐ 推荐使用 Windows 终端 (Windows 11 默认终端)运行程序以便获得最佳显示效果!


🥣 使用方法


如果仅需下载无水印作品文件,建议选择 程序运行Docker 运行;如果有其他需求,建议选择 源码运行


2.2 版本开始,项目功能无异常的情况下,无需额外处理 Cookie!


🖱 程序运行


Mac OS、Windows 10 及以上用户可前往 Releases 下载程序压缩包,解压后打开程序文件夹,双击运行 main 即可使用。


注意:Mac OS 平台可执行文件 main 可能需要从终端命令行启动;受设备限制,Mac OS 平台可执行文件尚未经过测试,无法保证可用性!


若通过此方式使用程序,文件默认下载路径为:.\_internal\Download;配置文件路径为:.\_internal\settings.json


⌨️ Docker 运行



  1. 获取镜像


    • 方式一:使用 Dockerfile 文件构建镜像

    • 方式二:使用 docker pull joeanamier/xhs-downloader 命令拉取镜像


  2. 创建容器


    • TUI 模式:docker run -it joeanamier/xhs-downloader

    • API 模式:docker run -it joeanamier/xhs-downloader python main.py server



Docker 运行项目时不支持 命令行调用模式,无法使用 读取剪贴板监听剪贴板 功能,可以正常粘贴内容,其他功能如有异常请反馈!


⌨️ 源码运行



  1. 安装版本号不低于 3.12 的 Python 解释器

  2. 下载本项目最新的源码或 Releases 发布的源码至本地

  3. 打开终端,切换至项目根路径

  4. 运行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 命令安装程序所需模块

  5. 运行 main.py 即可使用


🛠 命令行模式


项目支持命令行运行模式,若想要下载图文作品的部分图片,可以使用此模式设置需要下载的图片序号!


可以使用命令行 从浏览器读取 Cookie 并写入配置文件!


命令示例:python .\main.py --browser_cookie Chrome --update_settings


bool 类型参数支持使用 truefalse10yesnoonoff(不区分大小写)来设置。








🖥 服务器模式


启动:运行命令:python .\main.py server


关闭:按下 Ctrl + C 关闭服务器


请求接口:/xhs/


请求方法:POST


请求格式:JSON


请求参数:

参数
类型
含义
默认值

url
str
小红书作品链接,自动提取,不支持多链接

download
bool
是否下载作品文件;设置为 true 将会耗费更多时间
false

index
list[int]
下载指定序号的图片文件,仅对图文作品生效;download 参数设置为 false 时不生效
null

skip
bool
是否跳过存在下载记录的作品;设置为 true 将不会返回存在下载记录的作品数据
false

代码示例:



def api_demo():
server = "http://127.0.0.1:8000/xhs/"
data = {
"url": "https://www.xiaohongshu.com/explore/123456789",
"download": True,
"index": [
3,
6,
9,
],
}
response = requests.post(server, json=data)
print(response.json())

🕹 用户脚本


如果您的浏览器安装了 Tampermonkey 浏览器扩展程序,可以添加 用户脚本,无需下载安装即可体验项目功能!



脚本安装成功后,打开小红书页面,查看脚本说明,并根据提示操作。






提示:使用 XHS-Downloader 用户脚本批量提取作品链接,搭配 XHS-Downloader 程序可以实现批量下载无水印作品文件!


💻 二次开发


如果有其他需求,可以根据 main.py 的注释提示进行代码调用或修改!



async def example():
"""通过代码设置参数,适合二次开发"""
# 示例链接
error_link = "https://github.com/JoeanAmier/XHS_Downloader"
demo_link = "https://www.xiaohongshu.com/explore/xxxxxxxxxx"
multiple_links = f"{demo_link} {demo_link} {demo_link}"
# 实例对象
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" # 图文作品文件下载格式,支持:PNG、WEBP
folder_mode = False # 是否将每个作品的文件储存至单独的文件夹
# 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,
) as xhs: # 使用自定义参数
download = True # 是否下载作品文件,默认值:False
# 返回作品详细信息,包括下载地址
# 获取数据失败时返回空字典
print(await xhs.extract(error_link, download, ))
print(await xhs.extract(demo_link, download, index=[1, 2]))
# 支持传入多个作品链接
print(await xhs.extract(multiple_links, download, ))

📋 读取剪贴板


项目使用 pyperclip 实现读取剪贴板功能,该模块在不同的系统上会有差异。


在 Windows 上,不需要额外的模块。


在 Mac 上,该模块使用 pbcopy 和 pbpaste 命令,这些命令应该随操作系统一起提供。


在 Linux 上,该模块使用 xclip 或 xsel 命令,这些命令应该随操作系统一起提供。否则,请运行 "sudo apt-get install xclip" 或 "sudo apt-get install xsel"(注意:xsel 似乎并不总是有效)


在其他 Linux 系统上,你需要安装 qtpy 或 PyQT5 模块。


⚙️ 配置文件


项目根目录下的 settings.json 文件,首次运行自动生成,可以自定义部分运行参数。


如果设置了无效的参数值,程序将会使用参数默认值!

参数
类型
含义
默认值

work_path
str
作品数据 / 文件保存根路径
项目根路径

folder_name
str
作品文件储存文件夹名称
Download

name_format
str
作品文件名称格式,字段之间使用空格分隔,支持字段:收藏数量评论数量分享数量点赞数量作品标签作品ID作品标题作品描述作品类型发布时间最后更新时间作者昵称作者ID
发布时间 作者昵称 作品标题

user_agent
str
浏览器 User Agent
内置 Chrome User Agent

cookie
str
小红书网页版 Cookie,无需登录,非必需参数!

proxy
str | dict
设置程序代理
null

timeout
int
请求数据超时限制,单位:秒
10

chunk
int
下载文件时,每次从服务器获取的数据块大小,单位:字节
2097152(2 MB)

max_retry
int
请求数据失败时,重试的最大次数,单位:秒
5

record_data
bool
是否保存作品数据至文件,保存格式:SQLite
false

image_format
str
图文作品文件下载格式,支持:PNGWEBP
该参数影响下载图片时所用的接口,并非固定图片格式!
PNG

image_download
bool
图文作品文件下载开关
true

video_download
bool
视频作品文件下载开关
true

live_download
bool
图文动图文件下载开关
false

folder_mode
bool
是否将每个作品的文件储存至单独的文件夹;文件夹名称与文件名称保持一致
false

download_record
bool
是否记录下载成功的作品 ID,如果开启,程序将会自动跳过下载存在记录的作品
true

language
str
设置程序语言,目前支持:zh_CNen_GB
zh_CN

其他说明:user_agent参数获取示例;强烈建议根据实际浏览器信息进行设置!



🌐 Cookie


2.2 版本开始,项目功能无异常的情况下,无需额外处理 Cookie!



  1. 打开浏览器(可选无痕模式启动),访问 https://www.xiaohongshu.com/explore

  2. 登录小红书账号(可跳过)

  3. 按下 F12 打开开发人员工具

  4. 选择 网络 选项卡

  5. 勾选 保留日志

  6. 过滤 输入框输入 cookie-name:web_session

  7. 选择 Fetch/XHR 筛选器

  8. 点击小红书页面任意作品

  9. 网络 选项卡选择任意数据包(如果无数据包,重复步骤7)

  10. 全选复制 Cookie 写入程序或配置文件





🗳 下载记录


XHS-Downloader 会将下载过的作品 ID 储存至数据库,当重复下载相同的作品时,XHS-Downloader 会自动跳过该作品的文件下载(即使作品文件不存在),如果想要重新下载作品文件,请先删除数据库中对应的作品 ID,再使用 XHS-Downloader 下载作品文件!


该功能默认开启,如果关闭该功能,XHS-Downloader 会检查文件是否存在,若文件存在则跳过下载!


♥️ 支持项目


如果 XHS-Downloader 对您有帮助,请考虑为它点个 Star ⭐,感谢您的支持!

微信(WeChat)
支付宝(Alipay)

微信赞助二维码
支付宝赞助二维码

如果您愿意,可以考虑提供资助为 XHS-Downloader 提供额外的支持!


✉️ 联系作者



说明:QQ 群聊仅限于讨论项目使用问题,严禁发布任何广告,严禁讨论任何账号交易、账号流量、流量变现、灰色产业等相关的内容!


作者的其他开源项目:



💰 项目赞助


PyCharm logo

JetBrains 支持全球开源社区认可的活跃项目,并为非商业开发提供免费许可证。


⚠️ 免责声明



  • 使用者对本项目的使用由使用者自行决定,并自行承担风险。作者对使用者使用本项目所产生的任何损失、责任、或风险概不负责。

  • 本项目的作者提供的代码和功能是基于现有知识和技术的开发成果。作者尽力确保代码的正确性和安全性,但不保证代码完全没有错误或缺陷。

  • 使用者在使用本项目时必须严格遵守 GNU
    General Public License v3.0
    的要求,并在适当的地方注明使用了 GNU General Public License
    v3.0
    的代码。

  • 使用者在任何情况下均不得将本项目的作者、贡献者或其他相关方与使用者的使用行为联系起来,或要求其对使用者使用本项目所产生的任何损失或损害负责。

  • 使用者在使用本项目的代码和功能时,必须自行研究相关法律法规,并确保其使用行为合法合规。任何因违反法律法规而导致的法律责任和风险,均由使用者自行承担。

  • 本项目的作者不会提供 XHS-Downloader 项目的付费版本,也不会提供与 XHS-Downloader 项目相关的任何商业服务。

  • 基于本项目进行的任何二次开发、修改或编译的程序与原创作者无关,原创作者不承担与二次开发行为或其结果相关的任何责任,使用者应自行对因二次开发可能带来的各种情况负全部责任。


在使用本项目的代码和功能之前,请您认真考虑并接受以上免责声明。如果您对上述声明有任何疑问或不同意,请不要使用本项目的代码和功能。如果您使用了本项目的代码和功能,则视为您已完全理解并接受上述免责声明,并自愿承担使用本项目的一切风险和后果。

# 💡 项目参考

* https://github.com/encode/httpx/
* https://github.com/tiangolo/fastapi
* https://github.com/textualize/textual/
* https://github.com/omnilib/aiosqlite
* https://github.com/thewh1teagle/rookie
* https://github.com/carpedm20/emoji/
* https://github.com/asweigart/pyperclip
* https://github.com/lxml/lxml
* https://github.com/yaml/pyyaml
* https://github.com/pallets/click/
* https://github.com/encode/uvicorn
* https://github.com/Tinche/aiofiles