资讯动态

xhs 开发全史:从 CHANGELOG 解读小红书 Web SDK 的功能演进、签名机制与核心实现

发布时间:2026/10/4 1:42:12 来源:尧图企业网站定制
网页爬虫【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址https://gitcode.com/gh_mirrors/xh/xhs点击查看免费下载本篇技术指南以开源仓库 xhs基于小红书 Web 端进行请求封装的 Python 爬取 SDK根目录下的 CHANGELOG.md 为骨架结合 xhs/core.py、xhs/help.py、xhs/exception.py 等源码实现与 tests/、example/ 目录下的用例与示例系统梳理该库从 0.0.1 到 0.2.13 的功能演进脉络并深入到签名x-s / x-t / x-s-common、登录、笔记抓取、互动、发布与创作者数据等核心模块的调用链。读者读完可掌握xhs 各版本新增能力与修复点分别对应哪些 API 与源码位置如何借助 CHANGELOG 快速定位功能实现以及各核心模块的入参、返回结构与底层原理。一、版本脉络总览一条从项目骨架到发布与创作者数据的主线CHANGELOG 记录了从 0.0.1 到 0.2.13当前仓库中 xhs/version.py 声明__version__ 0.2.13的完整迭代。按功能主线可划分为六个阶段阶段版本区间核心主题代表性条目项目奠基0.0.1 ~ 0.0.3工程化起步项目结构、Sphinx 文档、PyPI/文档/测试 CI数据获取基础0.0.4 ~ 0.1.2签名与抓取 APIx-s 签名、按 id/关键词取笔记、用户信息与笔记列表互动与评论0.1.0 ~ 0.1.5社区交互能力点赞/收藏/关注/评论、二维码登录、批量抓取异常与容错0.1.7 ~ 0.2.0稳定性加固IP 封禁异常、x-s-common、HTML 解析取笔记登录与发布0.2.1 ~ 0.2.7完整闭环手机号登录、图文/视频笔记发布创作者平台0.2.8 ~ 0.2.13通知与数据报表通知 API、笔记概览/统计、登录修复从 CHANGELOG 可以明显看出项目的演进策略先搭工程骨架再补数据获取随后补齐互动闭环最后向创作者后台与发布能力延伸。下面按这一主线展开每一条版本记录都对应到源码中的具体实现。二、工程化起步0.0.1 ~ 0.0.3结构、文档与 CI0.0.1Structuring project基于 Python 官方指南的结构化项目布局确立了xhs/包目录、docs/文档目录、tests/测试目录的划分这一布局在仓库中延续至今。0.0.2新增 Sphinx 文档即仓库中的 docs/ 目录docs/conf.py、docs/index.rst 等。0.0.3新增 pypi、doc、test 三类 CI actions对应根目录的 setup.py用于 PyPI 打包发布、tox.ini 与 setup.cfg[tool:pytest]段配置addopts -v --covxhs --cov-report term --cov-report xml即运行测试并统计覆盖率以及 docs 构建配置。这一阶段奠定了可安装、可测试、有文档的三位一体工程基础后续所有功能迭代都在此框架内进行。三、签名机制演进x-s、search_id 与 x-s-common签名是小红书 Web 端请求能否被服务端接受的核心也是 CHANGELOG 中反复出现的主题。0.0.4引入 x-s 与 search_id 签名首个签名版本新增了两类签名x-s 请求签名用于 Web 端 API 请求的合法性校验search_id 签名搜索类接口需要携带的会话标识。search_id的生成逻辑在 xhs/help.py 中实现get_search_id()以当前毫秒时间戳左移 64 位再加上一个 0 ~ 2147483646 之间的随机数再经base36encode编码得到被 xhs/core.py 的get_user_by_keyword和 xhs/core.py 的get_note_by_keyword注入请求体。0.1.7新增 x-s-common 签名0.1.7 在 x-s / x-t 之外补上了x-s-common。完整的签名实现在 xhs/help.py 的sign()函数中以毫秒时间戳v拼出原始串{v}test{uri}{json 序列化后的 data}对原始串做 MD5再用内置的 32 字节映射表h()变换得到x_sx_t即为时间戳本身组装common字段s0平台码、x1版本号、x2操作系统、x3客户端标识xhs-pc-web、x5为 cookie 中的a1、x7为 x-s、x9为经 CRC32 表mrc()计算的校验值等经encodeUtf8与自定义 base64b64Encode编码为x-s-common。x-s-common 的加入意味着服务端校验从单点签名升级为请求摘要 环境指纹复合校验。在 xhs/core.py 的_pre_headers中quick_signTrue时创作者/客户域请求会一次性把x-s、x-t、x-s-common三个头写入 session。0.2.2构造函数支持自定义 sign 函数0.2.2 是一个架构转折点签名逻辑从库内置解耦允许外部注入。xhs/core.py 的构造函数签名改为def __init__(self, cookieNone, user_agentNone, timeout10, proxiesNone, signNone):当不传sign时_pre_headers默认走内置help.signquick_signTrue传入自定义sign时则调用外部函数并接管 header 注入。这是因为内置的纯 Python 签名在平台调整算法后可能失效而浏览器环境如 Playwright中调用页面内window._webmsxyw(url, data)获取签名的方式往往更稳。仓库中的 example/basic_usage.py、example/login_qrcode.py、example/login_phone.py 都演示了同一个外部签名模板通过 Playwright 打开小红书首页、注入 stealth 脚本与a1cookie再执行window._webmsxyw取得X-s与X-t并带 10 次失败重试。自定义签名函数需满足(uri, data, a1, web_session) - {x-s: ..., x-t: ...}的约定tests/test_xhs.py 中的test_external_sign_func即验证了外部签名函数的注入流程。四、笔记数据获取从 API 直取到 HTML 解析笔记是小红书内容的最小单元CHANGELOG 围绕它持续迭代。0.0.4get_note_by_id 等首批数据 API首批数据 API 包括get_note_by_id、get_self_info、get_user_info、get_home_feed、get_note_by_keyword、get_user_notes。其中get_note_by_id的现代实现位于 xhs/core.py向/api/sns/web/v1/feedPOSTsource_note_id、image_formatsjpg/webp/avif、xsec_source、xsec_token等字段返回res[items][0][note_card]。0.1.7get_note_by_id_from_html —— 绕开接口的备选通道0.1.7 新增了从 HTML 页面解析笔记详情的 API。实现位于 xhs/core.py直接请求https://www.xiaohongshu.com/explore/{note_id}?xsec_token...用正则抓取window.__INITIAL_STATE__{...}/script中的状态数据把undefined替换为后通过递归的camel_to_underscoretransform_json_keys把驼峰键名统一转为下划线风格再取出note_detail_map[note_id][note]。0.2.1 修复了该方法解析视频笔记时的错误视频笔记的video字段结构与图文不同递归转换需正确处理嵌套字典与列表。0.2.12修复 HTML 解析失效0.2.12 修复get_note_by_id_from_htmlbroken——这类修复通常是页面结构如__INITIAL_STATE__字段名、note_detail_map 层级或反爬策略变化导致的解析路径失效。0.1.1搜索排序与类型过滤0.1.1 为get_note_by_keyword增加sort与note_type参数。对应枚举定义在 xhs/core.pySearchSortTypegeneral默认、popularity_descending最热、time_descending最新与SearchNoteType0 全部、1 仅视频、2 仅图片并在 xhs/core.py 中序列化为sort与note_type字段随 POST 请求提交。0.0.4 ~ 0.1.2用户笔记抓取get_user_notesxhs/core.pyGET/api/sns/web/v1/user_posted返回仅含封面、标题、互动信息与 note_id 的简化数据0.1.2 新增的get_user_all_notesxhs/core.py则通过has_more/cursor循环翻页对每条笔记再调get_note_by_id补齐完整字段组装成NoteNamedTuplexhs/core.py含 note_id、title、desc、type、user、img_urls、video_url、tag_list、collected_count、comment_count、liked_count、share_count、time、last_update_time 等字段并支持crawl_interval间隔控制。0.1.5修复get_user_all_notes丢失time与last_update_time——即 0.1.2 初版组装Note时未带上笔记时间戳0.1.5 补全。0.2.0修复get_user_all_notes对异常笔记的捕获错误——现在遇到笔记状态异常NOTE_ABNORMAL或NOTE_SECRETE_FAULT见下文异常章节时跳过该笔记继续抓取而非中断整个流程。0.1.4用户点赞与收藏笔记新增get_user_like_notesGET/api/sns/web/v1/note/like/page与get_user_collect_notesGET/api/sns/web/v2/note/collect/page两者都支持num与cursor分页位于 xhs/core.py。五、异常体系从 IP 封禁到验证码识别0.1.7 ~ 0.2.12CHANGELOG 中多次出现xxx should throw error或xxx error条目对应的是 xhs/exception.py 中完整的异常体系错误类型触发条件来源IPBlockError0.1.7 新增请求过频被服务端封禁 IP错误码 300012xhs/exception.pySignErrorx-s 签名错误错误码 300015xhs/exception.pyDataFetchError其余业务错误xhs/exception.pyNeedVerifyError0.2.12 相关触发验证码HTTP 461/471xhs/exception.py核心判断逻辑在 xhs/core.py 的request()方法中0.1.7 新增的 IP 封禁与签名错误抛异常逻辑基于响应 JSON 的code与ErrorEnum比对xhs/exception.py 定义了IP_BLOCK 300012、SIGN_FAULT 300015等枚举值0.2.12修复461 和 471 应该抛错误此前遇到状态码 461/471触发了验证码风控时静默返回导致调用方无法感知修复后在request()中读取响应头的Verifytype与Verifyuuid抛出携带这两个字段的NeedVerifyError0.2.8修复 trace id 包含 spectrum 的错误get_trace_idxhs/help.py在处理包含spectrum关键字的图片 URL 时需返回spectrum/xxx形式否则生成的图片 URL 无效。六、登录闭环二维码 → 手机号 → 创作者0.1.0 ~ 0.2.130.1.0二维码登录新增get_qrcode与check_qrcodexhs/core.pyget_qrcodePOST/api/sns/web/v1/login/qrcode/create返回{qr_id, code, url}check_qrcodeGET/api/sns/web/v1/login/qrcode/status轮询扫码状态。完整流程见 example/login_qrcode.py把返回的url渲染成二维码终端打印循环轮询code_status为 2已确认时打印login_info与当前 cookie。0.2.7手机号登录新增send_code/check_code/login_code三段式登录xhs/core.py先send_code发送短信验证码再check_code换取mobile_token最后login_code完成登录并写入 cookie。配套示例 example/login_phone.py 演示了完整交互流程含验证码错误时的重试循环。0.2.10send_code 从 v1 升级到 v20.2.10 将验证码发送接口从/api/sns/web/v1/login/send_code迁移到/api/sns/web/v2/login/send_code——Web 端接口版本迭代是反爬调整的常见形式CHANGELOG 如实记录了这一变更。0.2.13修复手机登录与二维码登录错误最新版本 0.2.13 集中修复了两类登录方式的错误可见登录链路始终是维护重点。从实现看登录成功与否最终反映在 xhs/core.py 的cookieproperty 上——cookiesetter 会调用 xhs/help.py 的update_session_cookies_from_cookie解析 cookie 字符串并重建 session 的 CookieJar。此外 0.1.0 还提供了login_from_creatorxhs/core.py与二维码get_qrcode_from_creator/check_qrcode_from_creatorxhs/core.py、customer_loginxhs/core.py等创作者侧登录方式示例见 example/login_qrcode_from_creator.py。七、互动与内容操作0.1.0 的功能井喷0.1.0 是单版本新增 API 最多的一次覆盖社区互动的全部基本动作均实现于 xhs/core.py评论comment_notePOST/api/sns/web/v1/comment/post支持at_users、delete_note_comment、comment_user对指定评论回复带target_comment_id关注follow_user/unfollow_userPOST/api/sns/web/v1/user/follow、/unfollow收藏collect_note/uncollect_note注意收藏是note_id取消收藏的请求体字段为note_ids点赞like_note/dislike_note请求体字段为note_oid、like_comment/dislike_comment文件下载save_files_from_note_idxhs/core.py——按 note_id 拉取笔记用get_valid_path_namexhs/help.py将:/\|?*替换为下划线清洗标题作为目录名视频笔记下载 mp4、图文笔记逐张下载 png。0.1.1 修复了标题含非法字符时保存失败的问题0.2.0 修复了该函数的错误。0.1.3评论抓取三件套新增get_note_commentsxhs/core.pyGET/api/sns/web/v2/comment/page、get_note_sub_commentsxhs/core.pyGET/api/sns/web/v2/comment/sub/pagenum超过 30 也只会返回 30 条与get_note_all_commentsxhs/core.py——后者递归拉取主评论及其所有楼中楼子评论同样支持crawl_interval限速。八、发布能力从创建笔记到图文/视频发布0.2.4 ~ 0.2.50.2.4create_note 通用创建接口create_notexhs/core.pyPOST/web_api/sns/v2/note请求体包含commontype、title、desc、source、business_binds、ats、hash_tag 话题、privacy_info 私密属性与可选的image_info/video_info并携带Origin/Referer指向创作者后台的请求头。post_time参数支持%Y-%m-%d %H:%M:%S字符串内部会转换为毫秒时间戳写入notePostTiming从而实现定时发布。0.2.5图文笔记与视频笔记create_image_notexhs/core.py逐张调用get_upload_files_permit(image)获取file_id/token经upload_filexhs/core.py支持 image/jpeg、image/png、video/mp4上传组装image_info.images后调用create_notecreate_video_notexhs/core.py视频大于 5MB 时走upload_file_with_slicexhs/core.py按 5MB 分片 打印进度 create_complete_multipart_upload合并未指定封面时循环调用get_video_first_frame_image_idxhs/core.py访问fe_api/burdock/v2/note/query_transcode等待平台转码生成首帧封面wait_time默认 3 秒、最多尝试 10 次。0.2.11修复图片与视频发帖错误0.2.11 集中修复发布链路上的错误——包括上传授权get_upload_files_permitxhs/core.pyfile_type取images或videocount默认 1与上传/组装环节的问题。0.2.8新增通知 API新增三类站内通知拉取接口xhs/core.pyget_mention_notifications 我的、get_like_notifications收到的赞、get_follow_notifications新粉丝均支持num与cursor分页分别对应/api/sns/web/v1/you/mentions、/likes、/connections。九、创作者平台数据概览与统计0.2.100.2.10 新增的两个接口标志着 xhs 从抓取工具延伸到创作者数据助手get_notes_summaryxhs/core.pyGET/api/galaxy/creator/data/note_detail_new需携带Referer: https://creator.xiaohongshu.com/creator/notes?sourceofficial并以is_creatorTrue请求创作者域get_notes_statisticsxhs/core.pyGET/api/galaxy/creator/data/note_stats/new参数page_size仅支持 12/24/36/48sort_by默认timenote_type0 全部 / 1 图文 / 2 视频time为统计时间窗is_recent默认 True当time7时应传 False。这两个接口使用创作者域 hosthttps://creator.xiaohongshu.comxhs/core.py并走quick_sign签名路径。此外 xhs/core.py 的get_self_info_from_creator0.2.3 之前已有与get_creator_note_listxhs/core.py也属于创作者侧能力。十、辅助工具与近期工程改进0.1.8 ~ dev0.1.8将图片/视频 URL 获取函数收敛到 help 模块get_imgs_url_from_note、get_video_url_from_note等xhs/help.py并修正get_img_url的命名——图片 CDN 随机选择sns-img-*四个节点与无水印格式参数imageView2/format/...均在此模块中。0.2.6修复无水印图片 URL 错误无水印链接需从info_list中提取原始 trace_id 再拼 CDN。0.1.7 附带修复无 cookie 初始化客户端会抛异常——xhs/help.py 的 cookie 解析逻辑会在缺失a1/webId/gid时自动补齐默认值保证XhsClient()无 cookie 也能完成初始化。0.2.4 附带修复cookie key 含空格时解析错误——xhs/help.py 的cookie_str_to_cookie_dict对;分隔的每个kv块做 strip消除键名两端的空白。0.2.3 附带修复basic usage 不可用——即示例代码与最新签名接口不同步的问题最终通过 0.2.2 的自定义签名机制与示例更新解决。0.2.3 新增get_self_info2xhs/core.pyGET/api/sns/web/v2/user/me与get_home_feed_categoryxhs/core.pyGET/api/sns/web/v1/homefeed/category返回categories。get_home_feedxhs/core.py配合 xhs/core.py 的FeedType枚举RECOMMEND、FASION、FOOD、COSMETICS、MOVIE、CAREER、EMOTION、HOURSE、GAME、TRAVEL、FITNESS 共 11 类信息流消费。dev 分支改进文档与增加更多测试函数——对应 tests/test_xhs.py覆盖客户端初始化、cookie setter/getter、外部签名、笔记抓取、评论、登录、互动等约 40 个用例与 tests/test_help.py覆盖 sign、search_id、cookie 解析等工具函数以及 example/ 下 7 个可直接运行的示例脚本。十一、速查如何用 CHANGELOG 定位功能实现CHANGELOG 是理解本仓库最快的索引。将条目映射到源码的通用方法按版本号过滤0.x.y条目通常只改一处先看版本号定位改动范围按动词分类add ... api 对应 xhs/core.py 中新增的XhsClient方法fix ... error 对应 xhs/help.py 的工具函数、xhs/core.py 的请求处理或 cookie 解析逻辑change/improve 对应文档docs/与示例example/用测试反查tests/test_xhs.py 中同名测试如test_get_note_by_id、test_login_from_creator验证的正是 CHANGELOG 中对应新增的 API可作实现正确性的第一手依据对照版本常量xhs/version.py 的__version__与__build__0x000213用于确认当前仓库所处版本避免误读历史条目。以0.2.12 fix 461 and 471 should throw error为例先在 xhs/core.py 找到response.status_code 471 or response.status_code 461分支与NeedVerifyError抛错再在 xhs/exception.py 确认异常携带verify_type/verify_uuid字段最后可在 xhs/init.py 确认该异常已从包根导出。至此一条 changelog 条目的是什么、在哪、怎么用就全部闭环了。十二、适用前提与合规提醒运行环境本仓库在 setup.py 声明python_requires3.7依赖仅requests与lxmlsetup.py安装方式为python -m pip install xhsPyPI 发布或从 git 安装最新源码内置sign()为纯 Python 实现若平台校验升级导致签名失效应参考 example/ 中的 Playwright 自定义签名方案。接口前提多数 Web 端接口需要有效 cookie部分还需xsec_token登录、发布、创作者数据等接口对 cookie 状态与权限要求更高。合规与频率仓库 README 已明确声明其主要用于 Python 学习实践且网络爬取可能涉及合规风险应避免对目标网站施加压力或进行未授权操作。使用crawl_interval、timeoutxhs/core.py 构造参数默认 10 秒等限速参数是必要的自我保护当触发IPBlockError时应立即停止请求。赞分享网页爬虫【免费下载链接】xhs基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/项目地址https://gitcode.com/gh_mirrors/xh/xhs点击查看免费下载相关推荐XHS-Downloader核心技术解析突破小红书API安全机制的技术实现XHS Downloader核心技术解析突破小红书API安全机制的技术实现 在当今数据驱动的互联网时代小红书作为国内领先的生活方式分享平台其内容价值日益凸网页爬虫解密小红书签名算法XHS-Downloader参数生成核心逻辑全解析解密小红书签名算法XHS Downloader参数生成核心逻辑全解析 引言小红书API的数字门卫 你是否曾在开发小红书爬虫时遭遇过神秘的401错误是否网页爬虫Sentry JavaScript SDK 4.x 版本演进全解从 Changelog 到核心机制的源码级解读Sentry JavaScript SDK 4.x 版本演进全解从 Changelog 到核心机制的源码级解读 本文以官方仓库中的 v4 版本 Changel可观测性上一篇vue-preview 使用指南下一篇Attention-Gated Networks网格注意力层深度剖析2D与3D实现对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑