网易首页 > 网易号 > 正文 申请入驻

使用 resuests 访问 Python 包索引(PyPI)的 JSON API | Linux 中国

0
分享至

导读:PyPI 的 JSON API 是一种机器可直接使用的数据源,你可以访问和你浏览网站时相同类型的数据。

本文字数:5191,阅读时长大约: 6分钟

https://linux.cn/article-13356-1.html
作者:Ben Nuttall
译者:MjSeven

PyPI(Python 软件包索引)提供了有关其软件包信息的 JSON API。本质上,它是机器可以直接使用的数据源,与你在网站上直接访问是一样的的。例如,作为人类,我可以在浏览器中打开 Numpy 项目页面,点击左侧相关链接,查看有哪些版本,哪些文件可用以及发行日期和支持的 Python 版本等内容:

NumPy project page

但是,如果我想编写一个程序来访问此数据,则可以使用 JSON API,而不必在这些页面上抓取和解析 HTML。

顺便说一句:在旧的 PyPI 网站上,还托管在 pypi.python.org 时,NumPy 的项目页面位于 pypi.python.org/pypi/numpy,访问其 JSON API 也很简单,只需要在最后面添加一个 /json ,即 https://pypi.org/pypi/numpy/json。现在,PyPI 网站托管在 pypi.org,NumPy 的项目页面是 pypi.org/project/numpy。新站点不会有单独的 JSON API URL,但它仍像以前一样工作。因此,你不必在 URL 后添加 /json,只要记住 URL 就够了。

你可以在浏览器中打开 NumPy 的 JSON API URL,Firefox 很好地渲染了数据:

JSON rendered in Firefox

你可以查看 inforeleaseurls 其中的内容。或者,你可以将其加载到 Python Shell 中,以下是几行入门教程:

  1. import requests

  2. url = "https://pypi.org/pypi/numpy/json"

  3. r = requests.get(url)

  4. data = r.json()

获得数据后(调用 .json() 提供了该数据的 字典),你可以对其进行查看:

Inspecting data

查看 release 中的键:

Inspecting keys in releases

这表明 release 是一个以版本号为键的字典。选择一个并查看以下内容:

Inspecting version

每个版本都包含一个列表,release 包含 24 项。但是每个项目是什么?由于它是一个列表,因此你可以索引第一项并进行查看:

Indexing an item

这是一个字典,其中包含有关特定文件的详细信息。因此,列表中的 24 个项目中的每一个都与此特定版本号关联的文件相关,即在 https://pypi.org/project/numpy/1.20.1/#files 列出的 24 个文件。

你可以编写一个脚本在可用数据中查找内容。例如,以下的循环查找带有 sdist(源代码包)的版本,它们指定了 requires_python 属性并进行打印:

  1. for version, files in data['releases'].items():

  2. for f in files:

  3. if f.get('packagetype') == 'sdist' and f.get('requires_python'):

  4. print(version, f['requires_python'])

sdist files with requires_python attribute

piwheels

去年,我在 piwheels 网站上实现了类似的 API。piwheels.org 是一个 Python 软件包索引,为树莓派架构提供了 wheel(预编译的二进制软件包)。它本质上是 PyPI 软件包的镜像,但带有 Arm wheel,而不是软件包维护者上传到 PyPI 的文件。

由于 piwheels 模仿了 PyPI 的 URL 结构,因此你可以将项目页面 URL 的 pypi.org 部分更改为 piwheels.org。它将向你显示类似的项目页面,其中详细说明了构建的版本和可用的文件。由于我喜欢旧站点允许你在 URL 末尾添加 /json 的方式,所以我也支持这种方式。NumPy 在 PyPI 上的项目页面为 pypi.org/project/numpy,在 piwheels 上,它是 piwheels.org/project/numpy,而 JSON API 是 piwheels.org/project/numpy/json 页面。

没有必要重复 PyPI API 的内容,所以我们提供了 piwheels 上可用内容的信息,包括所有已知发行版的列表,一些基本信息以及我们拥有的文件列表:

JSON files available in piwheels

与之前的 PyPI 例子类似,你可以创建一个脚本来分析 API 内容。例如,对于每个 NumPy 版本,其中有多少 piwheels 文件:

  1. import requests

  2. url = "https://www.piwheels.org/project/numpy/json"

  3. package = requests.get(url).json()

  4. for version, info in package['releases'].items():

  5. if info['files']:

  6. print('{}: {} files'.format(version, len(info['files'])))

  7. else:

  8. print('{}: No files'.format(version))

此外,每个文件都包含一些元数据:

Metadata in JSON files in piwheels

方便的是 apt_dependencies 字段,它列出了使用该库所需的 Apt 软件包。本例中的 NumPy 文件,或者通过 pip 安装 Numpy,你还需要使用 Debian 的 apt 包管理器安装 libatlas3-baselibgfortran

以下是一个示例脚本,显示了程序包的 Apt 依赖关系:

  1. import requests

  2. def get_install(package, abi):

  3. url = 'https://piwheels.org/project/{}/json'.format(package)

  4. r = requests.get(url)

  5. data = r.json()

  6. for version, release in sorted(data['releases'].items(), reverse=True):

  7. for filename, file in release['files'].items():

  8. if abi in filename:

  9. deps = ' '.join(file['apt_dependencies'])

  10. print("sudo apt install {}".format(deps))

  11. print("sudo pip3 install {}=={}".format(package, version))

  12. return

  13. get_install('opencv-python', 'cp37m')

  14. get_install('opencv-python', 'cp35m')

  15. get_install('opencv-python-headless', 'cp37m')

  16. get_install('opencv-python-headless', 'cp35m')

我们还为软件包列表提供了一个通用的 API 入口,其中包括每个软件包的下载统计:

import requests

url = "https://www.piwheels.org/packages.json"
packages = requests .get (url ) .json ( )
packages = {
pkg : (d_month , d_all )
for pkg , d_month , d_all , *_ in packages
}

package = 'numpy'
d_month , d_all = packages [package ]

print (package , "has had" , d_month , "downloads in the last month" )
print (package , "has had" , d_all , "downloads in total" )

pip search

pip search 因为其 XMLRPC 接口过载而被禁用,因此人们一直在寻找替代方法。你可以使用 piwheels 的 JSON API 来搜索软件包名称,因为软件包的集合是相同的:

  1. #!/usr/bin/python3

  2. import sys

  3. import requests

  4. PIWHEELS_URL = 'https://www.piwheels.org/packages.json'

  5. r = requests.get(PIWHEELS_URL)

  6. packages = {p[0] for p in r.json()}

  7. def search(term):

  8. for pkg in packages:

  9. if term in pkg:

  10. yield pkg

  11. if __name__ == '__main__':

  12. if len(sys.argv) == 2:

  13. results = search(sys.argv[1].lower())

  14. for res in results:

  15. print(res)

  16. else:

  17. print("Usage: pip_search TERM")

有关更多信息,参考 piwheels 的 JSON API 文档.

本文最初发表在 Ben Nuttall 的 Tooling Tuesday 博客上,经许可转载使用。

via: https://opensource.com/article/21/3/python-package-index-json-apis-requests

作者:Ben Nuttall 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

欢迎遵照 CC-BY-NC-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
结交政治骗子、隐瞒不报家庭房产情况,59岁老虎被提起公诉!

结交政治骗子、隐瞒不报家庭房产情况,59岁老虎被提起公诉!

上观新闻
2024-11-26 11:18:07
网红条纹哥彻底凉凉!曝去展馆被打流鼻血,官方发声,行为太低俗

网红条纹哥彻底凉凉!曝去展馆被打流鼻血,官方发声,行为太低俗

星光历史
2024-11-23 14:50:07
女老师因“板书幼态”,被家长举报后停职,师范生的解释很现实!

女老师因“板书幼态”,被家长举报后停职,师范生的解释很现实!

妍妍教育日记
2024-11-24 19:06:49
国家队“暂停”托市!四大消息传来,未来A股走势或已无悬念

国家队“暂停”托市!四大消息传来,未来A股走势或已无悬念

风口招财猪
2024-11-26 01:45:02
很突然!浙江下雪了!刚刚确认:-2℃!宁波全域预警!这波实在太猛,务必当心!当心!

很突然!浙江下雪了!刚刚确认:-2℃!宁波全域预警!这波实在太猛,务必当心!当心!

鲁中晨报
2024-11-26 12:08:27
奶奶临终前分财产,收养的大伯主动离开,我父亲拦住:我有话说

奶奶临终前分财产,收养的大伯主动离开,我父亲拦住:我有话说

农村情感故事
2024-11-19 06:54:21
生产过后,闺蜜给我推荐了私人产后修复按摩,按摩师竟是个帅小伙

生产过后,闺蜜给我推荐了私人产后修复按摩,按摩师竟是个帅小伙

坏故事集
2024-11-20 16:43:24
袈裟下的资本有多惊人?身披16万袈裟,名下18家企业,存款超30亿

袈裟下的资本有多惊人?身披16万袈裟,名下18家企业,存款超30亿

橘子大娱社
2024-11-25 21:30:03
张咪三次患癌后报平安!半边舌头已切除,外籍老公搀扶女儿未现身

张咪三次患癌后报平安!半边舌头已切除,外籍老公搀扶女儿未现身

西瓜爱娱娱
2024-11-26 11:20:27
川普要对近亲近邻加征20%关税意味着什么?

川普要对近亲近邻加征20%关税意味着什么?

小宇宙双色球
2024-11-26 12:05:36
李楚源被查后,广州公交集团原董事长李小军调任广药集团

李楚源被查后,广州公交集团原董事长李小军调任广药集团

南方都市报
2024-11-26 14:42:04
这辆奔驰,惹不起

这辆奔驰,惹不起

放毒
2024-11-24 23:19:44
意外!穆斯卡特说服三位强援跟上港签新合同,南美冠军队核心领衔

意外!穆斯卡特说服三位强援跟上港签新合同,南美冠军队核心领衔

我就爱说足球
2024-11-26 11:05:16
苹果史上最薄手机!曝iPhone 17 Air原型机无实体SIM卡槽

苹果史上最薄手机!曝iPhone 17 Air原型机无实体SIM卡槽

快科技
2024-11-26 10:07:13
退休人员注意!工龄30年以上,2025年起享受这几项福利,你了解吗

退休人员注意!工龄30年以上,2025年起享受这几项福利,你了解吗

社保小达人
2024-11-24 11:45:03
65岁毕福剑私人聚会曝光,首次承认再婚有俩娃,仍属央视老干部局

65岁毕福剑私人聚会曝光,首次承认再婚有俩娃,仍属央视老干部局

娱乐书坊
2024-11-26 11:09:36
外国人:百年屈辱史剩下的4900年你们在干嘛?评论区全是历史课代表

外国人:百年屈辱史剩下的4900年你们在干嘛?评论区全是历史课代表

美食阿鳕
2024-11-25 12:41:24
46岁小S豪宅内与老外跳热舞,穿紧身背心凹凸有致,没有一点赘肉

46岁小S豪宅内与老外跳热舞,穿紧身背心凹凸有致,没有一点赘肉

南城无双
2024-11-25 23:06:47
中方对日试行30天免签,那么日方呢?希望中日关系发展有新起点!

中方对日试行30天免签,那么日方呢?希望中日关系发展有新起点!

新民周刊
2024-11-26 09:07:12
吴柳芳惊人转变!致歉后新视频风格大变,粉丝瞬增至200万!

吴柳芳惊人转变!致歉后新视频风格大变,粉丝瞬增至200万!

小毅说事
2024-11-24 17:16:00
2024-11-26 15:47:00
Linux
Linux
Linux 中国开源社区
8016文章数 73120关注度
往期回顾 全部

科技要闻

华为Mate70系列正式发布

头条要闻

德国连环强奸案中国籍嫌犯身份披露 前女友发声

头条要闻

德国连环强奸案中国籍嫌犯身份披露 前女友发声

体育要闻

37岁,他用“半条右腿”重返巅峰

娱乐要闻

分手复合又打胎,黄晓明说希望是一场梦

财经要闻

洪灏刘煜辉对谈实录 涉及A股、债务等!

汽车要闻

入华10年 林肯用宋锦将美式豪华“中国化”

态度原创

房产
本地
手机
家居
公开课

房产要闻

合生把上百个亿万富豪搞破防了

本地新闻

城市24小时|领跑万亿城市,武汉“开挂”了?

手机要闻

学生党玩家首选 OPPO Reno13系列让你时刻信号稳定

家居要闻

色彩搭配 活跃空间气氛

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版