如何使用Python从cdnjs下载完整项目结构

1 投票
2 回答
1890 浏览
提问于 2025-06-08 05:49

我想把整个项目从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输出

使用本地文件:
本地输出

我该如何获得和使用cdnjs时相似的结构呢?
请给我一些建议。

相关问题:

  • 暂无相关问题
暂无标签

2 个回答

2

除了遍历一个固定的文件列表,你还可以考虑一些其他的方法,这些方法可以更灵活地从CDN获取文件。

  1. cdnjs是由一个GitHub仓库支持的,所以你可以考虑克隆这个仓库并提取文件(如果你这样做的话,建议使用稀疏检出,因为仓库的大小可能很大),或者你也可以使用GitHub的API来浏览这个仓库并提取文件:github.com/cdnjs/cdnjs/tree/master/ajax/libs/mathjax/2.7.5

  2. 其实我们有一个可用的API供cdnjs使用,这样你可以很方便地获取某个库的所有文件。利用这个列表,你可以执行类似Hamza建议的迭代方法,将所有文件下载到本地:https://api.cdnjs.com/libraries/mathjax?fields=assets(有点烦的是,我们还没有实现按版本导航的API)

希望这些信息对你有帮助!

Matt,cdnjs的维护者。

4

你提供给请求模块的URL只是一个文件的地址,叫做 MathJax.js,所以你只得到了这个文件作为输出。你想要的是下载整个目录 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)

本地目录结构输出:

下载所有文件后的本地目录

撰写回答