PyPI的JSONAPI是一种机器就绪数据源,可让您在浏览网页时访问相同类型的数据。PyPI(Python包索引)提供了一个JSONAPI,其中包含有关其包的信息。本质上是机器可以直接使用的数据源,就像你在网站上直接访问一样。例如,作为人类,我可以在浏览器中打开Numpy项目页面,单击左侧的相关链接,然后查看可用的版本、可用的文件以及发布日期和支持的Python版本:NumPy项目页面但是,如果我想编写一个程序来访问这些数据,可以使用JSONAPI,而不必抓取和解析那些页面上的HTML。顺便说一句:在旧的PyPI网站上,当它仍然托管在pypi.python.org时,NumPy的项目页面在pypi.python.org/pypi/numpy,访问它的JSONAPI也很简单,只需在末尾添加一个/json,即https://pypi.org/pypi/numpy/json。今天,PyPI网站位于pypi.org,NumPy项目页面为pypi.org/project/numpy。新网站不会有单独的JSONAPIURL,但仍会像以前一样工作。因此,您不必在URL后添加/json,只需记住URL即可。你可以在浏览器中打开NumPy的JSONAPIURL,Firefox会很好地呈现数据:JSONrenderedinFirefox你可以查看info、release和urls的内容。或者,您可以将它加载到PythonShell中,这里有几行开始:importrequestsurl="https://pypi.org/pypi/numpy/json"r=requests.get(url)data=r.json()获取到数据后(调用.json()提供了数据的字典),可以查看:Inspectingdatatoviewthekeysinrelease:Inspectingkeysinreleases可见release是一个字典,版本号为钥匙。选择一个并查看以下内容:检查版本包含每个版本的列表,发布包含24个项目。但是每个项目是什么?由于它是一个列表,您可以索引第一个项目并查看它:Indexinganitemwhichisadictionarywithdetailsaboutaparticularfile.因此,列表中的24个项目中的每一个都与与此特定版本号关联的文件相关,即https://pypi.org/project/numpy/1.20.1/#files中列出的24个文件。您可以编写脚本在可用数据中查找内容。例如,以下循环查找具有指定requires_python属性的sdist(源包)的版本并打印它:forversion,filesindata['releases'].items():forfinfiles:iff.get('packagetype')=='sdist'andf.get('requires_python'):print(version,f['requires_python'])sdistfileswithrequires_pythonattributepiwheels去年,我在piwheels网站上实现了类似的API.piwheels.org是一个Python包索引,它为RaspberryPi架构提供wheels(预编译的二进制包)。它本质上是PyPI包的镜像,但带有Armwheel而不是包维护者上传到PyPI的文件。由于piwheels模仿PyPI的URL结构,您可以将项目页面URL的pypi.org部分更改为piwheels.org。它将向您显示一个类似的项目页面,详细说明构建版本和可用文件。因为我喜欢旧站点允许您将/json添加到URL末尾的方式,所以我也支持它。NumPy在PyPI上的项目页面是pypi.org/project/numpy,在piwheels上是piwheels.org/project/numpy,JSONAPI是piwheels.org/project/numpy/json。无需重复PyPIAPI的内容,因此我们提供了有关piwheels上可用内容的信息,包括所有已知发行版的列表、一些基本信息以及我们拥有的文件列表:JSONfilesavailableinpiwheelsSimilar对于前面的PyPI示例,您可以创建一个脚本来分析API内容。例如,对于每个NumPy版本,有多少个piwheels文件:package['releases'].items()中的信息:ifinfo['files']:print('{}:{}files'.format(version,len(info['files'])))else:print('{}:Nofiles'.format(version))此外,每个文件都包含一些元数据:piwheels中JSON文件中的元数据方便地,apt_dependencies字段列出了使用该库所需的Apt包。本示例中的NumPy文件,或者要通过pip安装Numpy,您还需要使用Debian的apt包管理器安装libatlas3-base和libgfortran。下面是一个显示包的Apt依赖关系的示例脚本:(url)data=r.json()forversion,releaseinsorted(data['releases'].items(),reverse=True):对于文件名,fileinrelease['files'].items():如果文件名中的abi:deps=''.join(file['apt_dependencies'])print("sudoaptinstall{}".format(deps))print("sudopip3install{}=={}".format(package,version))returnget_install('opencv-python','cp37m')get_install('opencv-python','cp35m')get_install('opencv-python-headless','cp37m')get_install('opencv-python'-headless','cp35m')我们还提供了包列表的通用API条目,其中包括每个包的下载统计信息:importrequestsurl="https://www.piwheels.org/packages.json"packages=requests.get(url).json()packages={pkg:(d_month,d_all)forpkg,d_month,d_all,*_inpackages}package='numpy'd_month,d_all=packages[package]print(package,“有had",d_month,"downloadsinthelastmonth")print(package,"hashad",d_all,"downloadsintotal")pipsearchpipsearch因为它的XMLRPC接口过载而被禁用,所以人们一直在寻找替代品你可以使用piwheels的JSONAPI搜索包名称,因为包集是相同的:#!/usr/bin/python3importsysimportrequestsPIWHEELS_URL='https://www.piwheels.org/packages.json'r=requests.get(PIWHEELS_URL)packages={p[0]forpinr.json()}defsearch(term):forpkginpackages:ifterminpkg:yieldpkgif__name__=='__main__':iflen(sys.argv)==2:results=search(sys.argv[1].lower())forresinresults:print(res)else:print("Usage:pip_searchTERM")有关详细信息,请参阅piwheelsJSONAPI文档。
