更新日志 | JRT v2.11.0 与维护状态变更

5个月前 (12-07) 0 点赞 0 收藏 0 评论 13 已阅读

是的,JRT 九个月没更新了。

自从 JRT v3 进入技术验证以来,v2 版本就一直处于非活跃维护状态。

但直到现在,v3 依然没有发布,并且不会在短时间内发布,因此我们重启了 v2 的更新计划,现在它和简书小工具集等项目一样,处于活跃维护状态

过去九个月,我们接到了大量错误报告和关于性能的建议,因此这将是一个很大的功能版本,但我们尽可能保证了向后兼容,以便大家能在底层架构有一定变化的情况下,仍能比较平滑地完成迁移。

您可以点击查看该版本的 完整更新日志。

功能变动

贝壳小岛模块移除

贝壳小岛已于 2022 年 9 月 30 日关闭,相关信息:速报 | 贝壳小岛宣布将于本月底永久关闭、贝壳小岛关闭公告。

该版本移除了已不可用的贝壳小岛相关模块(beikeisland)。

如您有简书贝交易需求,可选择与信赖的简友私下交易,或使用「简书积分兑换平台」,参考文章:简书积分兑换平台使用攻略(完整版)。(不构成对交易平台的推荐,请用户自行判断风险)

这一交易平台的数据获取接口将在下个功能版本中发布。

性能优化:TCP 连接复用与 HTTP/2

网络请求是 JRT 接口耗时占比最大的部分,在这一版本中,我们通过对每个 host 使用全局唯一的 client 对象(位于 httpx_client.py),避免了 TCP 连接建立过程中的重复握手,大幅提升了批量请求场景下的性能。

同时,我们还对所有请求默认启用了 HTTP/2 支持,该协议通过连接多路复用、二进制请求头等方式,降低了网络传输量,也对请求性能有一定贡献。

应用这两项优化措施后,我们在简书数据采集工具 JFetcher 的 简书资产排行榜 采集任务上获得了 382% 的性能提升(474 秒 => 124 秒)。

我们相信,这一变动将大幅提高使用 JRT 进行大规模数据采集的速度,同时为实时数据分析带来新的机遇。

移除时区数据

在之前的版本中,我们会直接解析从简书接口返回的时间数据,而由于接口数据的多样性,部分数据带有时区信息,反映在 JRT 的抽象层上,datetime 对象会带有 tzinfo 属性,这导致了某些场景下的使用不便。

考虑到简书主要面向国内用户,其大部分接口的时间数据均不包含时区信息,我们在该版本中移除了以下 API 中时间数据包含的时区信息:

GetArticlePublishTime(获取文章发布时间)
GetCollectionArticlesInfo(获取专题文章信息)
GetUserArticlesInfo(获取用户文章信息)
GetUserTimelineInfo(获取用户动态信息)

以及它们在面向对象 API(jrt.objects)中的等价物:

article.publish_time
collection.articles_info
user.articles_info

这并非不兼容更改,对无时区信息的 datetime 对象进行 .replace 不会产生异常,但在完成版本升级后,您可从代码中安全移除相关的 .replace(tzinfo=None) 语句。

开发 / 构建

静态检查、类型检查、格式优化

我们已将静态检查工具由 Flake8 切换为更加快速的 Ruff,现在,对整个代码库进行扫描(开启我们使用的所有检查规则)仅需要 27ms。

得益于这一巨大的性能提升,我们现在可以应用更多的检查规则,全面优化 JRT 的代码风格,并降低出现 Bug 的可能性。

本次更新中,我们优化了部分函数的 return 语句逻辑,以避免不必要的变量创建,同时利用 contextlib.suppress 简化了部分错误处理。

类型检查工具已由 Mypy 切换为 Pyright,这也对类型检查带来了一定性能提升。

由于 Pyright 的「默认严格」特性,我们找出了一些缺少类型注解的函数,并修复了几处类型相关的潜在问题。

现在,所有默认值为 None(可选)的函数参数,其类型标注均不再依赖自动推断,而是直接写明 Optional[T],这对源码的可读性也有一定帮助。

我们通过 Black 重新格式化了全部代码,特别是模块导入部分,现在我们将遵循 Black 的风格规则。

RuffPyrightBlack 已成为我们所有活跃维护项目的默认选择。

切换到 Poetry

我们摒弃了原有基于 Pipenv 的依赖管理方案,切换到了 Poetry,现在,它已被我们的所有活跃项目使用。

受益于此,我们在开发流程中获得了一定效率提升。Poetry 将自动管理依赖和虚拟环境,并支持对纯 Python 包的一键构建和发布。

同时,统一的 pyproject.toml 文件(PEP 518)使我们可以在一个文件中管理大部分工具的配置。

错误修复

依赖版本固定问题

由于 Pipenv 的一个问题,我们在之前的版本中错误固定了所有依赖的版本号。这导致过去九个月中对 Httpxlxml 等库的更改无法被应用到依赖 JRT 的项目中。

在这一版本中,我们修复了该问题,并使用版本约束符号更新了依赖声明:

lxml = "^4.9.2"
httpx = { version = "^0.24.0", extras = ["http2"] }
tomd = { version = "^0.1.3", optional = true }
ujson = { version = "^5.7.0", optional = true }

现在,当依赖库发布不破坏向后兼容性的版本时,JRT 无需做出修改,您的依赖管理工具将自动处理相关变更。

总资产排行榜数据异常问题

在之前的版本中,我们将总资产数据作为简书钻数据返回。

该版本修复了这一问题,现在,您可以通过 GetAssetsRankData()[i]["assets"] 获取正确的总资产信息。

为保证向后兼容,FP 字段在 v2 中暂不移除,其值与 assets 字段相同,但它已被标记为弃用,请您在升级后自查项目中有无这一用法,并尽快完成迁移。

GetAssetsRankData 函数的 get_full 参数为 True,将获取真实的简书钻数据,并替换兼容用途的 FP 字段,简书贝(FTN)字段也将正确计算。

返回数据示例:

get_full=False

{
    'ranking': 2,
    'uid': 1483315,
    'uslug': '622a3993108c',
    'name': '任真',
    'avatar_url': 'https://upload.jianshu.io/users/upload_avatars/1483315/3ebd20ed-113d-4270-a60f-c4367c1675b2.jpg',
    'FP': 4648406.783,
    'assets': 4648406.783
}

get_full=True

{
    'ranking': 2,
    'uid': 1483315,
    'uslug': '622a3993108c',
    'name': '任真',
    'avatar_url': 'https://upload.jianshu.io/users/upload_avatars/1483315/3ebd20ed-113d-4270-a60f-c4367c1675b2.jpg',
    'FP': 3011036.012,
    'assets': 4648406.783,
    'FTN': 1637370.771
}

时间线数据获取异常问题

在之前的版本中,获取用户时间线数据(GetUserTimelineInfo)接口存在解析逻辑上的问题,导致部分情况下无法正确解析操作对应用户 URL(target_user_url)数据。

同时,由于解析流程中的一个错误,关注文集(follow_notebook)操作的目标文集 URL(target_notebook_url)存在解析错误。

为保证各操作的一致性,我们已将「评论文章」时间线项目的 operation_typecomment_note 变更为 comment_article,这是一个不兼容变更。

「关注专题」项也由 like_collection 变更为 follow_collection,同时移除错误的 opertor_type 字段。

Python >= 3.7

由于 pytest-xdist 库的 Python 版本要求,我们已将项目支持的最低 Python 版本调整至 3.7。

Python 3.6 已于 2021 年 12 月结束生命周期,为了您服务的安全性,请尽快完成升级。

在 JRT v3 中,我们将仅支持 Python 3.8 及以上版本,并跟随 Python 自身的版本生命周期进行最低版本约束调整。

HTTP/2 兼容性说明

从这一版本开始,JRT v2 将默认使用 HTTP/2 协议发送网络请求,目前不支持关闭。

如果您的网络环境不允许该协议通过,将自动降级至 HTTP/1.1。

在特殊情况下,您可能希望强制使用 HTTP/1.1 协议发送请求,我们并未对此提供直接的 API,但您可通过替换内部 HTTPX Client 对象达到此目的,操作方法如下:

jrt.httpx_client 模块导入 JIANSHU_API_CLIENTJIANSHU_PC_CLIENTJIANSHU_MOBILE_CLIENT 三个对象
对照原有对象声明创建新对象,但去除 http2=True 参数
用新对象替换原有对象

此内部实现不遵循语义化版本控制,可能随时发生变动。

后记

本次迭代是 JRT v2 阶段提升开发者体验的一次重大更新,通过引入连接复用和 HTTP/2 支持,我们在批量获取场景下获得了巨大的性能提升。

通过迭代我们的静态分析和类型检查工具,项目的代码质量得到一定改善。

本次更新修复了一些重大遗留问题,简化了开发流程,但同时引入了用户时间线数据相关的不兼容更改,请开发者在升级时留意。

JRT 将保持约两个月一个功能版本的迭代周期,直到 v3 正式版发布。

感谢各位开发者对 JRT 的支持,希望能和大家一同构建开放共享的简书生态。


更新日志 | JRT v2.11.0 与维护状态变更

本文收录在
0评论

登录

忘记密码 ?

切换登录

注册