独书先生 Menu

Viewing all items for tag python

Python in Excel 中的公开预览:将 Python 和 Excel 分析有机结合

Python 是当今最受欢迎的编程语言之一,深受企业和学生的喜爱,而 Excel 是一种必不可少的工具,用于组织、操作和分析各种数据。然而,直到现在,还没有一种简单的方法可以让这两个世界共同运作。

今天,我们非常高兴地介绍Python in Excel 中的公开预览——在同一 Excel 网格中实现 Python 和 Excel 分析的集成,以实现连续的工作流程。

Python in Excel 中将 Python 强大的数据分析和可视化库与您熟悉和喜爱的 Excel 功能相结合。您可以使用 Python 绘图和库在 Excel 中操作和探索数据,然后使用 Excel 的公式、图表和数据透视表进一步优化您的洞察力。

无缝工作

现在,您可以通过直接从 Excel 功能区访问 Python 在熟悉的 Excel 环境中进行高级数据分析。无需设置或安装。使用 Excel 内置的连接器和 Power Query,您可以轻松将外部数据带入 Python in Excel 工作流程中。

我们与 Anaconda 合作,Anaconda 是一家领先的企业级 Python 软件包库,全球数千万数据从业者在使用。Python in Excel 利用在 Azure 中运行的 Anaconda 发行版进行 Python 运行,其中包括最流行的 Python 库,如用于数据操作的 pandas,用于高级统计建模的 statsmodels,以及用于数据可视化的 Matplotlib 和 seaborn。

要查看机器学习和可视化示例,并了解更新,请访问 Excel 官方博客…

缩略图图像1标题:通过Python in Excel中无缝汇总和可视化您的数据。通过 Python in Excel 中无缝汇总和可视化您的数据。

轻松协作

在您喜爱的工具(如 Microsoft Teams 和 Microsoft Outlook)中共享工作簿和 Python 分析。通过评论和@提及无缝协作,与同事一起进行协同编辑,就像在 Excel 中一样。即使没有激活 Python in Excel,团队成员也可以刷新 Python in Excel 中的分析以获取最新信息。

缩略图图像2标题:通过评论和@提及轻松协作通过评论和@提及轻松协作

自动获得企业级安全性

保护您的数据是我们的首要任务,因此我们在 Python in Excel 的设计核心注入了安全性和隐私性。Python in Excel 在 Microsoft Cloud 上运行,作为 M365 连接体验,拥有企业级安全性。

在此了解有关我们数据安全性的更多信息

缩略图图像3标题:使用Python绘图可视化您的数据使用 Python 绘图可视化您的数据

查看客户和合作伙伴对 Python in Excel 的评价

缩略图图像4,标题为:介绍Python in Excel:数据分析和可视化的最佳结合

麦金尼 – “在 Excel 中运行 Python 简化了麦金尼的报告工作流程。我们过去需要在 Jupyter Notebook 中操作数据结构、筛选和汇总数据,然后在 Excel 中创建可视化效果。现在我们可以在 Excel 中管理整个工作流程。这将使 Excel 变得更加强大,并使 Python 在整个组织中更加易于使用。作为我职业生涯中最令人兴奋的更新,Python 支持是 Excel 的最大亮点!” – Greg Barnes,数据和分析执行总监

缩略图图像5,标题为:介绍Python in Excel:数据分析和可视化的最佳结合

麦格劳·希尔 – “麦格劳·希尔的理念是为所有人提供教育,我们与微软的合作有助于改善学生访问 Excel 工具,提高职业就业能力。Python 是大学和学院最需求的技能之一,我们对 Excel + Python 的组合感到非常激动,它将为教育工作者和学生提供一个强大的新途径,以更快地进行分析,实现更大的协作和学习,最终将学生引向更加光明的未来。” – Rebecca Olson,高级投资组合总监

缩略图图像6,标题为:介绍Python in Excel:数据分析和可视化的最佳结合

毕马威 – “毕马威和微软正在大力投资于提供先进的基于云的税务技术。在毕马威,我们对 Python in Excel 中的影响感到兴奋,这对我们的税务客户来说意义重大。在 Microsoft 云提供的数据和安全性承诺的支持下,Python 有可能增强高级分析的 Excel 体验,同时为公司提供透明度、简易性和对财务状况更深入的洞察力。” – Tejas Varia,税务数据与分析主管

而我们的工作才刚刚开始。敬请期待更多令人激动的消息!

通过 Python in Excel 使您的数据分析更加强大,讲述更好的故事。

开始使用 Python in Excel

对于在 Microsoft 365 Insiders 计划 Beta 频道中的人们,Python in Excel 正在进行公开预览。此功能将首先在 Windows 版的 Excel 中推出,从构建 16818 开始,然后在以后的日期推出到其他平台。

要使用 Python in Excel,加入Microsoft 365 Insiders 计划。选择 Beta 频道 Insider 级别,以获取 Excel 应用程序的最新版本。

安装最新的 Excel Insider 构建后,打开一个空白工作簿,然后执行以下步骤。

  1. 在功能区中选择“公式”。
  2. 选择“插入 Python”。
  3. 在弹出的对话框中选择“尝试预览”按钮。

还没有收到吗?这可能是我们的问题,而不是您的问题。功能会随着时间的推移发布,以确保一切正常运行。我们会突出显示您可能尚未拥有的功能,因为它们会逐渐发布给更多的内测人员。有时根据您的反馈,我们也会移除某些元素以进行进一步的改进。尽管这很少见,但我们还保留了在产品中完全取消某个功能的选择权,即使作为内测人员,您也有机会尝试它。

在预览版中,Python in Excel 将包括在您的 Microsoft 365 订阅中。在预览版之后,某些功能将在没有付费许可证的情况下受到限制。有关在正式发布之前将提供更多详细信息。

加入 Microsoft 365 Insiders 计划。成为第一个了解 Microsoft 365 应用程序和服务中的下一步内容的人,分享您的反馈,并加入我们的内测社区!

注册以获取有关 Python in Excel 未来可用性的通知

下一步的期望

如上所述,我们正在向 Insiders Beta 频道公开预览 Python in Excel,因此您应该期望很快会有新的功能。请关注以下领域的更新:改进的编辑体验(例如自动完成和语法突出显示)、默认修复、增强的错误行为、帮助和文档等。此外,为了防止滥用,系统目前具有一些数据大小和计算限制,我们将密切监控并进行调整。

我们需要您的反馈!Excel 和 Python 用户可以在应用程序内直接提供反馈(转到“帮助”>“反馈”),在我们的反馈门户上提出改进建议,或在GitHub上与我们的团队互动。

其他资源

Python in Excel 简介

开始使用 Python in Excel

了解更多关于 Anaconda 的信息

Python一键下载视频脚本分享

需求

小编通常会上一些专业的视频网站比如腾讯视频、优酷,在上面看电影、电视剧。这些网站有个优点,可以缓存视频,在通勤路上比如地铁就可以愉快的刷剧了,因为地铁上的网速通常不怎么好。

但是有一些经典电影或者电视剧,这些视频并没有提供,那么我们只能上一些小电影网站看了,资源是有了,但是问题来了,这些小电影网站大多数都没有视频下载功能,那在地铁上就没法看了。

如果可以把这些视频下载下来,再传输到手机里不就可以离线看了吗?

接下来小编就演示下如何用 python 脚本来实现一键下载小电影网站的视频。

以下脚本可以学习到

  • python selenium 的使用
  • python requests 的使用
  • 分片下载视频存储本地
  • 实时输出视频下载进度

注意:

  1. 这里的脚本主要用于测试学习目的,切勿用于生产环境等商业目的

  2. 推荐大家访问官方指定平台或专业视频网站,支持正版

解决方案

小编以经常看的在线之家为例,这个网站可以找到很多美剧资源。

首先,我们用谷歌浏览器打开一个视频地址,比如https://www.zxzj.fun/video/1529-1-1.html,按F12或者右击“检查”打开浏览器控制台

video url

然后,点击控制台最左边的选择元素按钮,或者按Ctrl + Shift + C,选择网页的视频区域,就能看到video标签

<video
  class="dplayer-video dplayer-video-current"
  webkit-playsinline=""
  playsinline=""
  preload="metadata"
  src="https://vod.pipi.cn/8f6897d9vodgzp1251246104/1881b495387702292624167851/f0.mp4"
></video>

可以发现src属性值就是视频链接,并且是采用单独的.mp4视频地址,这种地址原理上可以直接从浏览器下载的,直接复制这个地址在浏览器打开,就可以右击下载。但是电视剧通常有很多集,每次都手动打开网页-打开控制台-复制视频地址-再打开视频-最后下载视频,就很繁琐。这时候就是脚本排上用场的时候了,可以把这个流程自动化,简化重复操作的过程。

脚本的整体思路

  • 使用selenium打开网页
  • 通过selenium元素选择器找到video标签所在的iframe,切换到iframe
  • 通过video标签,获取到视频地址,然后请求视频内容
  • 采用分片下载的方式拼接视频存储到本地

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
# 谷歌浏览器驱动
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# sleep模块,让程序停止往下运行
from time import sleep

# 设置谷歌浏览器驱动
driver = webdriver.Chrome()

# 手动改为想要下载的视频所在网页地址
url = 'https://www.zxzj.fun/video/1529-1-1.html'

# 打开网页
driver.get(url)

try:
  # 通过元素选择器找到iframe
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(
            (By.CSS_SELECTOR, '#playleft iframe'))
    )
except:
    driver.quit()

# 获取到网页title,便于直观看到当前下载的视频标题
title = driver.find_elements(By.TAG_NAME, 'title')[
    0].get_attribute('innerHTML')

# 切换到iframe
driver.switch_to.frame(iframe)

# 通过video标签获取视频地址
video = driver.find_elements(By.TAG_NAME, 'video')[0]
video_url = video.get_attribute('src')
print('video', video_url)

# 已经获取到视频地址,可以关闭浏览器
driver.quit()

# 设置请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
}

# 请求视频内容
video_content = requests.get(video_url, headers=headers, stream=True)

print("开始下载")

# 视频大小
contentLength = int(video_content.headers['content-length'])

line = '大小: %.2fMB'

# 大小换算
line = line % (contentLength/1024/1024)

# 打印视频总长度
print(line)

# 存储已经下载的长度
downSize = 0

print('video_name', title)

# 分片下载
with open(title+'.mp4', "wb") as mp4:
    for chunk in video_content.iter_content(chunk_size=1024 * 1024):
        if chunk:
            mp4.write(chunk)

            # 记录已下载视频长度,实时输出下载进度
            downSize += len(chunk)
            print('进度:{:.2%}'.format(downSize / contentLength), end='\r')

print("下载结束")

总结

以上简单展示了使用 python 的requestsselenium库来下载一个mp4视频,可以当做一个学习案例。

其中还有很多待改进的地方

  • 每次运行脚本只能解析下载一个视频,或许可以改进为批量解析出一个视频列表来下载
  • 换视频地址下载,需要手动改源码的url地址,可以改进做一个界面交互来让用户输入
  • 当前只适配了特定网站的视频地址解析,其他地址不支持,可以改进针对不同的网站单独出解析函数来匹配

后续有时间再来分享更多有趣实用的 python 脚本。

参考

Pyodide 中实现网络请求的 3 种方法

原文:https://lwebapp.com/zh/post/pyodide-fetch

需求

小编之前提过一个在线 Python 工具,核心技术是用到了一个叫 Pyodide 的库,能够让 Python 在网页上运行,但是小编在学习过程中发现,并不是所有 Python 内置库或者扩展库都能运行,比如 requests是不支持的。
Continue reading…

网页版 Python 图片转字符画

需求

最近发现一个好玩的 Python 玩法,用 Python 将图片转为字符画,大多数都是本地程序,因为之前小编搭建过一个在线版的 Python,于是尝试了使用在线版的 Python 实现了图片转字符画。

在线 Python 编辑器: https://lwebapp.com/zh/python-playground

Continue reading…

分享一个好用的Python在线编辑器

原文:https://lwebapp.com/zh/python-online

需求

有小伙伴可能听说过 PyScript,知道了Python可以通过打包成wasm运行在浏览器端了,这样做一些需要Python来做的功能,可以直接在浏览器完成,无需和服务器交互,打开了开发者的想象力。

这里我们要推荐的是一个在线工具,也是支持Python代码的执行,一个在线的Python代码编辑器

Continue reading…

实现人手一个冰墩墩python画冰墩墩源码

背景

最近北京冬奥会正在举行,北京冬奥会的吉祥物“冰墩墩”非常抢手,很多朋友连夜排队都抢不到一个冰墩墩。

冰墩墩实在太火了,为了实现冰墩墩自由、“人手一墩”的梦想,强大的程序员GG奉上了一个用Python绘制冰墩墩的程序,先看下面这个动图体会下

真是太强大了,网友真是无所不能

思路和代码

技术上主要用到了python的turtle和tkinter模块,这两个模块都是Python内置的模块,非常强大。

  • turtle用来绘图,有多种绘制方式和样式
  • tkinter用来构建GUI程序,也内置了许多组件

主程序基本上就是采用turtle,设置不同的画笔和路径等绘制方式,一笔一笔接着在初始化好的tkinter Canvas画布上画出来的。核心功能也就完成了。

先启动一个tkinter界面,放置一个Canvas画布,再将turtle绘制区域设置到这个Canvas上

root = Tk()
root.geometry('600x700+500+60')
root.config(bg='white')
root.title('lwebapp.com')
root.resizable(False, False)
canvas = Canvas(root, width=600, height=600)
canvas.place(x=0,y=50)

t = RawTurtle(canvas)
t.hideturtle()

完整的代码到源码的main.py(https://github.com/openHacking/TKinter-UI/blob/main/demo/draw_bdd/main.py)文件查看

接着就是核心的绘制代码,由于代码太长这里贴出一部分

def draw_bdd(t):

    # reset
    t.penup()
    t.home()
    t.clear()

    # adjust the speed
    t.speed(30)

    # left hand
    t.goto(177, 112)

    t.pencolor("lightgray")

    t.pensize(3)

    t.fillcolor("white")

    t.begin_fill()

    t.pendown()

    t.setheading(80)

    t.circle(-45, 200)

    t.circle(-300, 23)

    t.end_fill()

完整的代码到源码的draw.py(https://github.com/openHacking/TKinter-UI/blob/main/demo/draw_bdd/draw.py)文件查看

最后,用 pytxui 这个python GUI组件库放了两个样式更美观的按钮做重新绘制和下载功能。

下载功能用到了Pillow的ImageGrab截图功能,可以将Canvas上的冰墩墩绘制结果保存为一张PNG图片。

核心的截图保存代码

from PIL import ImageGrab
import os

def save_image(root,widget):
    root.update()
    x=root.winfo_rootx()+widget.winfo_x()
    y=root.winfo_rooty()+widget.winfo_y()

    x1=x+widget.winfo_width()
    y1=y+widget.winfo_height()
    offset = 4
    ImageGrab.grab().crop((x + offset,y + offset,x1 - offset,y1 - offset)).save(os.getcwd() + "\\bdd.png", "PNG")

源码

pytxui-draw_bdd (https://github.com/openHacking/TKinter-UI/tree/main/demo/draw_bdd)

总结

以上我们结合当前大火的冰墩墩学习到了Python相关的知识

  • turtle和tkinter结合使用构造GUI
  • 如何构造一个漂亮的GUI按钮组件
  • 如何将tkinter Canvas画布下载为图片

其中还有很多不足,欢迎给作者多提建议和想法,一起学习提高。

参考

  • pytxui (https://github.com/openHacking/TKinter-UI)

Python + Selenium 自动化测试《人生重开模拟器》

背景

最近有一款小游戏特别火,叫《人生重开模拟器》,这款游戏用黑色幽默的调侃形式,随机生成你的人生大事件列表,开场还能抽取天赋加点,趣味性十足。

因为官网访问流量过大,有的朋友出现访问白屏、网页失效的情况,小编在这里发一个最新的人生重开模拟器在线链接:

https://dushusir.com/life/

不停地重开自己的人生之后,小编想着能不能写个脚本来自动化运行这款游戏,因为是纯网页操作,所以可以使用Python和Selenium组合的自动化测试神器来测试下。

思路

因为本质上这个游戏是一系列的网页操作,所以实现起来比较简单,就当是复习下Selenium的基本元素操作。想入门Python的童鞋可以看下,

以前小编写过一个 Python+Selenium自动化测试合成大西瓜一样可以作为学习。

注意:这不是一个智能的提高游戏分数的脚本,只是一个演示自动化测试学习案例,帮助大家更好的理解selenium的用法。

开发环境

  1. 下载Python并安装
  2. 安装pip
  3. 安装Selenium和浏览器webdriver

mac平台和windows平台有所不同,安装时注意下环境。细节问题这里就不列出了,大家多用户谷歌。

如果下载Python或者pip安装比较慢的,可以参考下这篇博文进行加速。

安装py模块神器

代码

环境准备好之后,直接复制以下代码到.py文件里,比如main.py,执行
python main.py即可启动webdriver运行自动化人生重开模拟器。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 谷歌浏览器驱动
from selenium import webdriver


# sleep模块,让程序停止往下运行
from time import sleep

# 导入 random(随机数) 模块
import random

# 手机模式加载谷歌浏览器
mobile_emulation = {'deviceName': 'iPhone 5'}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", mobile_emulation)


driver = webdriver.Chrome(chrome_options=options)

# 设置浏览器大小
driver.set_window_rect(0,0,700,700)

sleep(1)
# 打开设定的网址
driver.get('https://dushusir.com/life')

# 隐式等待
driver.implicitly_wait(5)

# 点击 立即重开
restart = driver.find_element_by_id('restart')
restart.click()

sleep(1)

# 点击 10连抽
driver.find_element_by_id('random').click()

sleep(1)

# 随机1-10数字,用于抽中天赋卡

randomOne = random.randint(1,3)
randomTwo = random.randint(4,6)
randomThree = random.randint(7,10)

# 找到三张天赋卡按钮并点击
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomOne) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomTwo) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomThree) +")").click()

# 点击确认:“请选择3个”
driver.find_element_by_css_selector("#next").click()

sleep(1)

# 点击随机分配
driver.find_element_by_css_selector("#random").click()

sleep(2)

# 开始新人生
driver.find_element_by_css_selector("#start").click()

# 持续点击人生大事件列表区域,直到列表区域内容不再增加,即表明人生结束
isOver = False # 结束标识
life = 0 # 前一个life长度

while(not isOver):

    # 点击列出人生大事件
    driver.find_element_by_css_selector("#lifeTrajectory").click()
    print('点击一次'+str(life))

    sleep(1)

    # 注意必须使用find_elements,不是find_element,否则len方法会报错
    li = driver.find_elements_by_css_selector("#lifeTrajectory li")

    currt_life = len(li)

    # 如果列表在继续增加,则继续点击;一旦不再增加,表明你挂了
    if currt_life > life:
        life = currt_life
    else:
        isOver = True
        print('结束')

# 点击人生总结
driver.find_element_by_id('summary').click()

sleep(5)
driver.quit()

总结

程序写的比较粗略,很多细节还没有完善,不过可以作为小案例参考,也欢迎大家批评指出问题。后续有时间再分享更多有用的测试脚本和好玩的游戏。

参考

Python+Selenium自动化测试合成大西瓜

问题

最近想要试一下玩合成大西瓜小游戏,就想能不能自动化运行这个游戏。相当于写一个自动化测试合成大西瓜的脚本,随机点击位置然后触发点击即可。

解决方案

直接采用自动化测试工具Python+Selenium,环境安装方法请参考 Selenium+Python自动化测试(一)

注意:这不是自动完成合成大西瓜的脚本,只是一个演示随机点击的自动化测试学习案例,帮助大家更好的理解selenium的用法。

合成大西瓜小游戏链接:https://dushusir.com/xigua/

(手机端使用微信或者自带浏览器打开即可开始游戏,PC端打开后用F12开启移动调试功能试玩)
适当游戏,娱乐中学习。

视频演示效果

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 谷歌浏览器驱动
from selenium import webdriver

# sleep模块,让程序停止往下运行
from time import sleep

# 操作链
from selenium.webdriver.common.action_chains import ActionChains


# 导入 random(随机数) 模块
import random

# 手机模式加载谷歌浏览器
mobile_emulation = {'deviceName': 'iPhone 5'}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome(chrome_options=options)

# 设置浏览器大小
driver.set_window_rect(0,0,700,700)

sleep(1)
# 打开设定的网址
driver.get('https://dushusir.com/xigua')

# 隐式等待
driver.implicitly_wait(5)

while(True):
    
    # 随机取位置
    randomX = random.randint(20,300)
    randomY = random.randint(200,300)

    print('click')
    # 设定点击位置  
    ActionChains(driver).move_by_offset(randomX, randomY).click().perform()

    # move_by_offset会累计上一次的位置,点击完重置
    ActionChains(driver).move_by_offset(-randomX, -randomY).perform()
    sleep(1)

# driver.quit()

更多

后续关注公众号:技术分社,获取最新脚本和小游戏动态

python目录和文件名转换成小写或大写

需求

linux服务器有大小写的区分,如果有静态文件的路径为驼峰命名MainStatic/FeatureJs.js,那么只能通过 MainStatic/FeatureJs.js访问,而无法通过mainstatic/featurejs.js访问,那么如何让这两个地址都可以访问呢?

思路

先使用带lua模块的nginx镜像:nginx-lua来托管我们的静态文件,能够实现大写的请求转发到小写上,然后再使用python脚本把静态文件全部改成小写的形式.

操作步骤

1.环境准备

docker, git, node, python3安装

centos下安装 docker, git, node, python环境

2. nginx-lua安装

docker run --name master_nginx_2 \
-v /etc/localtime:/etc/localtime \
-v /software/nginx/cert:/etc/nginx/cert \
-v /software/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /software/nginx/conf.d:/etc/nginx/conf.d \
-v /software/nginx/html:/usr/share/nginx/html \
-v /software/nginx/logs:/var/log/nginx \
--restart=always \
-p 80:80 -p 443:443 \
-d firesh/nginx-lua

3. nginx.conf配置

user nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 2;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 1k;
    gzip_types text/plain text/css application/octet-stream application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif image/png application/x-httpd-php application/vnd.ms-fontobject application/x-font-ttf font/ttf font/opentype font/x-woff image/svg+xml image/x-icon;
    include /etc/nginx/conf.d/*.conf;
}

FAQ

4. nginx配置转发

conf.d目录下,自己的配置文件增加lua转发规则
比如我的conf.d/01_www.lwebapp.com.conf

server {
    listen 80;
    server_name www.lwebapp.com lwebapp.com;   #域名
    rewrite ^(.*)$  https://$host$1 permanent;  #将所有http请求通过rewrite重定向到https
}
server {
    listen 443 ssl;   #SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动
    server_name www.lwebapp.com lwebapp.com;  # 要解析进来的域名

    ssl_certificate       /etc/nginx/cert/3114423_lwebapp.com.pem;
    ssl_certificate_key   /etc/nginx/cert/3114423_lwebapp.com.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  #使用此加密套件
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   #使用该协议进行配置
    ssl_prefer_server_ciphers on; 

    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 2;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 1k;
    gzip_types text/plain text/css application/octet-stream application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif image/png application/x-httpd-php application/vnd.ms-fontobject application/x-font-ttf font/ttf font/opentype font/x-woff image/svg+xml image/x-icon;

    location / {
        root   /usr/share/nginx/html/vue-demo;
        index  index.html index.htm;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

5. python脚本

python目录和文件名转换成小写或大写conver.py,放置在nginx/html下,后续html下会放置各个项目的静态文件,所以使用conver.py统一使用脚本处理

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os, sys


def convert(rootdir, optype='l'):
    """
    目录/文件名转换成小写或大写
    :param rootdir: 要转换的根目录路径
    :param optype: 操作类型(小写/大写)  小写:optype = 'l'  大写:optype = 'u',默认转换成小写
    :return:
    """
    dirlist = os.listdir(rootdir)
    for index, onedir in enumerate(dirlist):
        if optype == 'l':
            cdir = onedir.lower()
        elif optype == 'u':
            cdir = onedir.upper()
        subdir = os.path.join(rootdir, onedir)

        if onedir != cdir:      # 子目录或文件名不全为小写或大写
            subcdir = os.path.join(rootdir, cdir)
            os.rename(subdir, subcdir)          # 把大写的目录或文件名命名成小写或大写
            dirlist[index] = cdir
            subdir = subcdir

        # print(subdir)
        if os.path.isdir(subdir):
            convert(subdir, optype)

def help():
    print("use: python convert.py 'rootDirPath' {optype:'l'/'u'}")

def main():
    if len(sys.argv) == 2:
        convert(sys.argv[1])
    elif len(sys.argv) == 3:
        convert(sys.argv[1], sys.argv[2])
    else:
        help()
        exit(400)


if __name__ == '__main__':
    main()

6. 项目初始化

前置条件,安装node

# 进入/software/vue-demo/repository 目录
cd /
mkdir -p /software/vue-demo/repository
cd /software/vue-demo/repository

# 拉取初始代码
git clone https://github.com/Dushusir/vue-demo.git

# 进入vue-demo目并安装项目依赖
cd vue-demo
npm install
# 打包
npm run build

# 新建vue-demo
cd ../../../nginx/html
mkdir vue-demo

# 复制到托管目录
cd ../../vue-demo
yes | cp -r repository/vue-demo/dist/* ../nginx/html/vue-demo

7. 一键更新脚本

后续github上传代码后,在服务器任意位置使用 cd / && cd software/vue-demo && sh deploy_vue_demo.sh一键更新发布

#!/bin/bash
# 一键更新部署脚本,目录在:/software/vue-demo/下
# pull下来的网站代码仓库目录
input="repository/vue-demo"
# 挂载到容器的代码目录
output="../nginx/html/vue-demo"
cd $input

# 忽略本地,强制从线上更新下来
git fetch --all
git reset --hard origin/master 
git pull

# 打包
npm run build

# 备份
cd ../../$output && yes | cp -r * ../../../back/vue-demo
# 清空发布目录
rm -rf *
# 复制到发布目录
cd / && cd software/vue-demo && yes | cp -r $input/dist/* $output

# 文件名大写转小写
cd / && cd software/nginx/html && python3 conver.py "endoc" "l"

8. 一键回退脚本

cd / && cd software/vue-demo && sh back_deploy_vue_demo.sh

#!/bin/bash
# 一键回退脚本,目录在:/software/vue-demo/下
# 挂载html代码目录
output="../nginx/html/vue-demo"
# 清空发布目录
cd $output && rm -rf *
# 复制备份到发布目录
cd / && cd software/back/vue-demo && yes | cp -r * ../$output

参考

centos下安装 docker, git, node, python环境

1. git

yum install git

2. docker

centos下

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

或者参考docker-ce安装

3. node

1. install latest nvm

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

if no any response,try curl:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

v0.35.3 is latest version currently i use, change the version if you need.learn more aboutnvm

if you get error

curl: (7) Failed connect to raw.githubusercontent.com:443; Connection reset by peer

just try open the https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh in browser,download install.sh file manually, then upload to your server, tap sudo bash install.sh manually.

2. solve commond not found

source ~/.nvm/nvm.sh

3. install node v12.X latest version

nvm install 12

4. check node version

node -v

4. python 3

udo yum install yum-utils
sudo yum-builddep python
curl -O https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar xf Python-3.8.3.tgz
cd Python-3.8.3
./configure
make
sudo make install
alias python='/usr/local/bin/python3.8' #edit python command python3