是的,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 的支持,希望能和大家一同构建开放共享的简书生态。
网友评论