您好,登錄后才能下訂單哦!
本篇內容介紹了“如何使用resuests訪問Python包索引的JSON API”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
PyPI 的 JSON API 是一種機器可直接使用的數據源,你可以訪問和你瀏覽網站時相同類型的數據。
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
你可以查看 info
,release
和 urls
其中的內容。或者,你可以將其加載到 Python Shell 中,以下是幾行入門教程:
import requestsurl = "https://pypi.org/pypi/numpy/json"r = requests.get(url)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
屬性并進行打印:
for version, files in data['releases'].items(): for f in files: if f.get('packagetype') == 'sdist' and f.get('requires_python'): print(version, f['requires_python'])
sdist files with requires_python attribute
去年,我在 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 文件:
import requests url = "https://www.piwheels.org/project/numpy/json"package = requests.get(url).json() for version, info in package['releases'].items(): if info['files']: print('{}: {} files'.format(version, len(info['files']))) else: print('{}: No files'.format(version))
此外,每個文件都包含一些元數據:
Metadata in JSON files in piwheels
方便的是 apt_dependencies
字段,它列出了使用該庫所需的 Apt 軟件包。本例中的 NumPy 文件,或者通過 pip
安裝 Numpy,你還需要使用 Debian 的 apt
包管理器安裝 libatlas3-base
和 libgfortran
。
以下是一個示例腳本,顯示了程序包的 Apt 依賴關系:
import requests def get_install(package, abi): url = 'https://piwheels.org/project/{}/json'.format(package) r = requests.get(url) data = r.json() for version, release in sorted(data['releases'].items(), reverse=True): for filename, file in release['files'].items(): if abi in filename: deps = ' '.join(file['apt_dependencies']) print("sudo apt install {}".format(deps)) print("sudo pip3 install {}=={}".format(package, version)) return get_install('opencv-python', 'cp37m')get_install('opencv-python', 'cp35m')get_install('opencv-python-headless', 'cp37m')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
因為其 XMLRPC 接口過載而被禁用,因此人們一直在尋找替代方法。你可以使用 piwheels 的 JSON API 來搜索軟件包名稱,因為軟件包的集合是相同的:
#!/usr/bin/python3import sys import requests PIWHEELS_URL = 'https://www.piwheels.org/packages.json' r = requests.get(PIWHEELS_URL)packages = {p[0] for p in r.json()} def search(term): for pkg in packages: if term in pkg: yield pkg if __name__ == '__main__': if len(sys.argv) == 2: results = search(sys.argv[1].lower()) for res in results: print(res) else: print("Usage: pip_search TERM")
有關更多信息,參考 piwheels 的 JSON API 文檔.
“如何使用resuests訪問Python包索引的JSON API”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。