如何使用 Python 从 cdnjs 下载完整的项目结构
How to download the complete project structure from cdnjs using Python
我想从cdnjs云端下载完整的工程到本地文件夹。
我试过这个:
import requests
files = requests.get("https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML%2CSafe.js&ver=4.1")
with open("mathjax.js","w") as file:
file.write(files.text)
现在下载js文件。当我尝试使用相同的代码而不是 js 文件来获取项目时,输出很奇怪。
所以我尝试使用 cdnjs 并检查当我使用 cdnjs 云和使用本地文件时会发生什么。
我得到了如图所示的差异:
使用cdnjs:
使用本地文件:
如何获得与使用 cdnjs 时相似的结构?
请多多指教。
您提供给请求模块的 URL 只是一个文件 MathJax.js
的 URL,这就是为什么您只获取该文件作为输出的原因。
你想要的是下载完整的目录mathjax/2.7.5/
。但是,如果我们请求整个目录,服务器会禁止此类请求。
另一种方法是从主目录中获取所有文件的相对路径,如图所示。然后,您可以单独下载每个文件并将其存储到各自的文件夹中。您将在最后准备好整个目录。
为此尝试以下代码。
import requests
import os
baseUrl="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/" #Base URL for the main directory
#List containing relative paths of all required files
relativePaths=['config/Safe.js?V=2.7.5',
'config/TeX-AMS-MML_HTMLorMML.js?V=2.7.5',
'extensions/Safe.js?V=2.7.5',
'jax/output/SVG/fonts/TeX/fontdata.js?V=2.7.5',
'jax/output/SVG/jax.js?V=2.7.5',
'MathJax.js?config=TeX-AMS-MML_HTMLorMML%2CSafe.js&ver=4.1']
parentDir='\'.join(baseUrl.split('/')[-3:]) #Parent directory from URL
for path in relativePaths: #For all files
req=requests.get(baseUrl+path) #forming url
filename=path.split("/")[-1].split("?")[0] #extracting filename out of url
directory=os.path.join(parentDir,"\".join(path.split('/')[:-1])) #Extracting directories path for local path formation
if not os.path.exists(directory): #Creating local direcories if they do not exist
os.makedirs(directory)
with open(os.path.join(directory,filename),"wb+") as file: #Storing results into files
file.write(req.content)
本地目录结构输出:
除了迭代定义的文件列表之外,您还可以查看其他几个选项,这些选项可以采用更动态的方法从 CDN 获取文件。
cdnjs 由 GitHub 存储库提供支持,因此您可以探索克隆它并提取文件(由于存储库大小,如果您这样做,我建议您使用稀疏结帐)或您可以查看使用 GitHub API 浏览存储库和提取文件:github.com/cdnjs/cdnjs/tree/master/ajax/libs/mathjax/2.7.5
我们实际上有一个 API 可用于 cdnjs,它允许您相当轻松地获取库版本中的所有文件。使用该列表,您可以对 Hamza 建议的内容执行类似的迭代解决方案,以在本地获取所有文件的副本:https://api.cdnjs.com/libraries/mathjax?fields=assets(令人恼火的是,我们尚未实现每个版本的 API 导航)
希望对您有所帮助!
Matt,cdnjs 维护者。
我想从cdnjs云端下载完整的工程到本地文件夹。 我试过这个:
import requests
files = requests.get("https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML%2CSafe.js&ver=4.1")
with open("mathjax.js","w") as file:
file.write(files.text)
现在下载js文件。当我尝试使用相同的代码而不是 js 文件来获取项目时,输出很奇怪。
所以我尝试使用 cdnjs 并检查当我使用 cdnjs 云和使用本地文件时会发生什么。
我得到了如图所示的差异:
使用cdnjs:
使用本地文件:
如何获得与使用 cdnjs 时相似的结构?
请多多指教。
您提供给请求模块的 URL 只是一个文件 MathJax.js
的 URL,这就是为什么您只获取该文件作为输出的原因。
你想要的是下载完整的目录mathjax/2.7.5/
。但是,如果我们请求整个目录,服务器会禁止此类请求。
另一种方法是从主目录中获取所有文件的相对路径,如图所示。然后,您可以单独下载每个文件并将其存储到各自的文件夹中。您将在最后准备好整个目录。
为此尝试以下代码。
import requests
import os
baseUrl="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/" #Base URL for the main directory
#List containing relative paths of all required files
relativePaths=['config/Safe.js?V=2.7.5',
'config/TeX-AMS-MML_HTMLorMML.js?V=2.7.5',
'extensions/Safe.js?V=2.7.5',
'jax/output/SVG/fonts/TeX/fontdata.js?V=2.7.5',
'jax/output/SVG/jax.js?V=2.7.5',
'MathJax.js?config=TeX-AMS-MML_HTMLorMML%2CSafe.js&ver=4.1']
parentDir='\'.join(baseUrl.split('/')[-3:]) #Parent directory from URL
for path in relativePaths: #For all files
req=requests.get(baseUrl+path) #forming url
filename=path.split("/")[-1].split("?")[0] #extracting filename out of url
directory=os.path.join(parentDir,"\".join(path.split('/')[:-1])) #Extracting directories path for local path formation
if not os.path.exists(directory): #Creating local direcories if they do not exist
os.makedirs(directory)
with open(os.path.join(directory,filename),"wb+") as file: #Storing results into files
file.write(req.content)
本地目录结构输出:
除了迭代定义的文件列表之外,您还可以查看其他几个选项,这些选项可以采用更动态的方法从 CDN 获取文件。
cdnjs 由 GitHub 存储库提供支持,因此您可以探索克隆它并提取文件(由于存储库大小,如果您这样做,我建议您使用稀疏结帐)或您可以查看使用 GitHub API 浏览存储库和提取文件:github.com/cdnjs/cdnjs/tree/master/ajax/libs/mathjax/2.7.5
我们实际上有一个 API 可用于 cdnjs,它允许您相当轻松地获取库版本中的所有文件。使用该列表,您可以对 Hamza 建议的内容执行类似的迭代解决方案,以在本地获取所有文件的副本:https://api.cdnjs.com/libraries/mathjax?fields=assets(令人恼火的是,我们尚未实现每个版本的 API 导航)
希望对您有所帮助! Matt,cdnjs 维护者。