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

是的,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 的风格规则。

Ruff、Pyright 和 Black 已成为我们所有活跃维护项目的默认选择。

切换到 Poetry

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

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

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

错误修复

依赖版本固定问题

由于 Pipenv 的一个问题,我们在之前的版本中错误固定了所有依赖的版本号。这导致过去九个月中对 Httpx、lxml 等库的更改无法被应用到依赖 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_type 由 comment_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_CLIENT、JIANSHU_PC_CLIENT、JIANSHU_MOBILE_CLIENT 三个对象
  • 对照原有对象声明创建新对象,但去除 http2=True 参数
  • 用新对象替换原有对象

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

后记

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

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

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

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

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

版权声明:
作者:cc
链接:https://www.techfm.club/p/47693.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>