Как загрузить полную структуру проекта с CDN js, используя Python - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу загрузить полный проект из облака cdn js в локальную папку. Я пробовал это:

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, результат был странным.

Поэтому я попытался использовать cdn js и проверить, что происходит, когда я использую облако cdn js и когда я использую локальный файл.

Я получил эту разницу, как показано на изображениях :

Использование cdn js:
cdnjs output

Использование локального файла :
local output

Как я могу получить аналогичную структуру, которую получаю при использовании cdn js?
Пожалуйста, посоветуйте мне.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

URL-адрес, который вы предоставляете модулю запросов, представляет собой просто 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)

Вывод структуры локального каталога:

Local Directory after downloading all files

1 голос
/ 08 апреля 2020

Помимо итерации по определенному списку файлов, вы также можете взглянуть на несколько других опций, которые могут использовать более динамичный c подход для извлечения файлов из CDN.

  1. cdn js работает от репозитория GitHub, так что вы можете изучить его клонирование и извлечение файлов (я бы рекомендовал использовать sparse-checkout, если вы делаете это из-за размера репо), или вы можете посмотреть на использование GitHub API для навигации хранилище файлов извлечения: github.com/cdnjs/cdnjs/tree/master/ajax/libs/mathjax/2.7.5

  2. У нас фактически есть API, доступный для cdn js , что позволяет довольно легко получить все файлы в версии библиотеки. Используя этот список, вы можете затем выполнить итеративное решение, аналогичное предложенному Хамзой, чтобы получить копию всех файлов локально: https://api.cdnjs.com/libraries/mathjax?fields=assets (досадно, мы еще не реализовали переход API для каждой версии)

Надеюсь, это поможет! Мэтт, cdn js сопровождающий.

...