天天看点

不足100行Python代码,一键下载UNPKG项目文件!UNPKG一键下载代码解析

最近,州的先生打算用饿了么团队开源的

Element-UI

组件来扩展

MrDoc

的前端界面。本着怎么简单怎么来、不把简单问题搞复杂的原则,选择脱离

webpack

npm

那一套前端工程化的东西,直接在

HTML

页面中调用

JS

文件。

按照

element-ui

官方文档的介绍,使用

unpkg

提供的CDN地址,直接引用即可。

不足100行Python代码,一键下载UNPKG项目文件!UNPKG一键下载代码解析

使用CDN固然很方便,但是考虑在很多朋友都是在隔离的内容进行部署,所以将CDN上的静态文件下载到本地很有必要。

UNPKG

的网站上下载吧,太繁琐了,毕竟一个UI组件项目有成百上千个文件。

不足100行Python代码,一键下载UNPKG项目文件!UNPKG一键下载代码解析

幸而,在网上找到了一个Python下载unpkg项目的脚本,输入项目模块名之后,就可以一键运行下载,很是方便。

代码来源:https://www.jianshu.com/p/6b58bdc9fc6f
不足100行Python代码,一键下载UNPKG项目文件!UNPKG一键下载代码解析

看了下它的代码,不足100行,简单但是有条理性和逻辑性,很适合刚刚入门编程的朋友进行学习和参考。

因为这些朋友多是对基础知识有一定的了解,但是却不知道从何开始编写程序和代码。下面我们一起来看看这份代码。

完整代码如下所示:

import requests, re, os, time, shutil

url = "https://unpkg.com/"
mod = "element-ui"
version = ""
headers = {'Accept-Language': 'zh-CN,zh;q=0.8',
           'Content-Type': 'text/html;Charset=utf-8',
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
           }

# 获取HTML
def getHTML(url, encoding='utf-8'):
    rd = requests.get(url, params=None, headers=headers)
    rd.encoding = encoding
    return rd.text

# 获取版本
def getVsions(m):
    h = getHTML(url + m + '/')
    j = re.findall(r'<select name="version"(.*?)</select>', h, re.S)[0]
    patt = re.compile(r'<option.+?>(.+?)</option>')
    option = patt.findall(j)
    return option

# 扫描目录
def getPaths(v, p='/', files=[], folders=[]):
    h = getHTML(url + v + p)
    t = re.findall(r'<table(.*?)</table>', h, re.S)[0]
    href = re.findall('href="(.*?)"', t)
    for name in href:
        path = p + name
        # if name in ['../','LICENSE'] or not 'iconfont' in path:#material-design-icons
        if name in ['../', 'LICENSE'] or path in ['/src/', '/packages/', '/types/', '/dist/docs/', '/docs/',
                                                  '/samples/', "/test/", "/locale/"]:  # 跳过
            continue
        print(path)
        if name[-1] == '/':
            folders.append(path)
            getPaths(v, path, files, folders)
        else:
            files.append(path)
    return {"files": files, "folders": folders}

# 创建目录
def makeDirs(dirs, p):
    if p == None:
        p = './'
    for i in dirs:
        path = p + i
        if not os.path.exists(path):
            print("创建目录", path)
            os.makedirs(path)

# 下载文件
def download(url, path=None):  # dir=保存文件夹路径
    if not os.path.exists(path):
        print("下载:", url)
        r = requests.get(url)
        t = str(time.time()) + '.' + str(pid) + '.tmp'
        open(t, 'wb').write(r.content)
        shutil.move(t, path)
    else:
        print("文件已存在")

pid = os.getpid()
print(url + mod + '/')
versions = getVsions(mod)
print("所有版本:", versions)
version = mod + '@' + versions[-1]
print("默认版本:", version)
paths = getPaths(version)
makeDirs(paths["folders"], version)
for i in paths["files"]:
    u = url + version + i
    download(u, version + '/' + i)
print("完成")           

复制

引入模块

首先在第一行,它引入了所需要的 5 个模块,分别是:

  • requests,用于发起

    HTTP

    请求;
  • re,用于进行正则匹配;
  • os,用于进行系统性的操作,比如创建目录;
  • time,用于时间处理;
  • shutil,用于文件处理;

所以,这个简单的程序就涉及了在

Python

中使用如下功能:

不足100行Python代码,一键下载UNPKG项目文件!UNPKG一键下载代码解析

定义变量

接着在第3到5行,它定义了 4 个变量,分别为:

  • url:指定

    unpkg

    网站的主网址;
  • mod:指定项目模块的名称;
  • version:指定项目模块的版本;
  • headers:指定请求头;

定义功能函数

随后在第11行到第63行,它定义了 5 个功能函数,分别为:

  • getHTML():接受url作为参数,用于发起 HTTP 请求并获取响应内容;
  • getVsions():接受模块名称作为参数,用于获取项目模型的版本信息;
  • getPaths():接受版本号作为参数,用于获取模块的目录结构;
  • makeDirs():用于创建存放下载文件的目录;
  • download():接受url参数,用于下载指定的文件。

getHTML()

getHTML()

函数使用

requests

模块的

get

方法来请求

unpkg

的项目文件地址,以获取项目文件的内容。

getVsions()

getVsions()

函数用来从调用

getHTML()

函数返回的网页

HTML

响应中提取项目的版本信息,这一功能通过

re

模块写正则表达式来实现。其实这里也可以使用更加方便的

BeautifulSoup

来实现。

getPaths()

getPaths()

函数用于扫描项目的文件目录,其中主要也是请求网页之后,使用正则表达式进行正则匹配。

makeDirs()

makeDirs()

函数用于在本地创建目录,通过

os

模块的

path.exists()

方法来判断本地路径是否存在,通过

os

模块的

makedirs()

方法创建一个文件夹。

download()

download()

方法用于将请求到的文件内容写入到临时文件,然后将临时文件移动到目标目录中。其中,

requests

模块用于请求文件内容,

open()

方法用于新建一个文件,并将文件内容写入文件,

shutil

模块的

move()

方法用于将新建的文件移动到指定文件夹。

调用和执行功能函数

最后的65~76行代码,就是对上述各个功能函数的执行和调用。

不足100行Python代码,一键下载UNPKG项目文件!UNPKG一键下载代码解析

最后

这份代码虽然很简短,但也是麻雀虽小、五脏俱全;虽然还有可优化完善的地方,但也是能够减轻手动下载文件的负担。

很多初学Python的朋友,学完基础知识之后,脱离书本之后,不知道从何开始写程序,我想,从身边的繁琐工作或行为入手、从日复一日浪费时间的操作入手,不失为一个好的经世致用的方法。

同时,我们其实还可以将这份代码使用

Python

的图形界面模块,比如

Tkinter

PyQt5

PySide2

等,将其制作为一个桌面图形用户界面程序,再使用

Pyinstaller

等打包工具,打包为全平台的软件,造福更多的有同样使用需求的朋友。