通过 FTP 使用 Python 自动压缩网站图像

图像压缩对于技术SEO世界来说并不陌生,但是随着核心生命体征形式的网站性能是一个排名因素,现在是时候开始采取行动了。我已经做了几十次网站审计,我发现 80% 的网站性能问题都可以在图像或 JavaScript 下进行。当我看到图像是一个大问题时,我会欢呼,因为它是最容易解决的问题之一。主要的常见问题之一是提供未压缩图像的网站。这些图像包含的数据比人眼清晰且不会降级(加上元数据)所需的数据更多。

我们可以去除不需要的数据,通常会将文件大小减少 80+%。这可能会对网站性能产生深远的影响。我经常看到网站加载超过1MB的图像。除非你经营一家艺术或摄影商店(尽可能高的质量很重要),否则在这个时代,这是荒谬的。许多常见的CMS现在都有内置或插件功能来处理图像压缩,但我仍然遇到那些不常见或传统的CMS没有,你需要使用FTP。在这种情况下,您需要本教程!

在本教程中,我将向您展示设置自动化过程以下载当天的新图像,压缩它们,然后将其上传回服务器是多么容易。全部免费!

要求和假设

  • 已安装 Python 3 并理解基本的 Python 语法

  • 访问Linux安装(我推荐Ubuntu)或centos

  • FTP 登录到主机服务器并访问服务器映像文件夹

导入模块并设置身份验证

在我们开始之前,请记住注意您在此处复制的任何内容的缩进,因为有时代码片段无法完美复制。下面的所有模块都应该在核心Python 3中。我发现我需要将 PIL 更新到最新版本 8.2,您可以通过终端中的以下命令执行此操作:

pip3 install PIL --upgrade

  • ftplib:处理 FTP 连接

  • Pathlib:帮助干净地识别图像扩展

  • Dateutil:扩展日期时间模块

  • datatime:处理日期和时间函数

  • PIL:处理图像压缩

  • 操作系统:用于在本地打开和写入文件

  • glob:扩展操作系统模块

导入 Python 模块

让我们首先导入上面描述的这个脚本所需的模块。

from ftplib import FTP

import pathlib

from dateutil import parser

from datetime import date

from datetime import datetime

from PIL import Image

import PIL

import os

import glob

设置 FTP 连接

接下来,我们设置 FTP 连接变量。请注意,编写的此脚本不安全。如果您需要通过 TLS 进行 FTP。有一些小的修改,例如使用 FTP_TLS() 函数,您可以在本文档中找到这些修改。然后我们使用刚刚设置的变量建立连接。最后,我们打开图像所在的文件夹。许多系统将创建子文件夹。在这种情况下,您需要开发某种递归方法来循环访问文件夹。这超出了本教程的范围。

host = "YOUR_SERVER_IP"

port = "YOUR_PORT"

username = "YOUR_USERNAME"

password = "YOUR_PASSWORD"

img_folder_path = "WHERE_YOUR_IMAGES_ARE_STORED_ON_SERVER"

ftp = FTP()

ftp.set_debuglevel(2)

ftp.connect(host, port)

ftp.login(username, password)

ftp.cwd(img_folder_path )

设置脚本变量

接下来,我们使用 ftp.mlsd() 函数捕获文件夹中所有图像的名称。我们只能优化 JPG 和 PNG 文件,因此让我们将它们放在一个列表中以与服务器上的文件匹配。然后,我们需要定义在本地存储要优化的未压缩图像的位置。最后,我们存储今天的日期以与服务器上的文件匹配,因此我们只下载今天上传的内容。这可以防止您下载所有内容并将它们优化为无限大。最后,如果日志文件尚不存在,我们会创建一个日志文件,以便我们可以跟踪一段时间内的优化。

names = ftp.mlsd()

imglist = [".jpg",".jpeg",".png",".JPG",".JPEG",".PNG"]

rawpath = "UNCOMPRESSED_IMG_PATH_LOCAL"

today = date.today()

todayshort = today.strftime("%Y/%m/%d")

logfile = open(rawpath + "opt/log.txt", "a")

循环浏览图像

现在我们已经捕获了服务器上文件夹中的所有文件名,我们只能处理那些修改日期等于今天且扩展名在我们的列表中。例如,昨天上传的文件或 gif 和 webp 文件将不会下载进行处理。

for name, facts in names:

mod_date = str(datetime.strptime(facts["modify"],"%Y%m%d%H%M%S"))[:10]

if pathlib.Path(name).suffix in imglist and mod_date == todayshort:

优化图像

如果我们遇到满足我们要求的文件,我们使用 ftp.retrbinary() 将文件下载到我们为 rawpath 设置的任何路径。接下来,我们为未压缩的图像创建一个名为 filename 的变量,其中包含文件的本地路径。然后,我们需要创建一个子文件夹来容纳优化的图像。这样,如果您对结果不满意,可以随时恢复到原始图像。永远不要覆盖您的原始文件,始终保留备份。

最后,我们使用PIL模块中的Image功能打开图像并将文件重新保存到优化的子文件夹设置优化参数为True并将质量设置为合理的65。玩转质量水平。对于某些图像,您可以下降到35并且还可以,但一般来说,您会发现自己在65-80之间。

ftp.retrbinary("RETR " + name, open(rawpath + name, 'wb').write)

filename = rawpath + name

filename_opt = rawpath + "opt/" + name

picture = Image.open(filename)

picture.save(filename_opt, optimize=True, quality=65)

上传和日志

准备好新的优化文件后,是时候将其上传回服务器并覆盖原始文件了(保留本地原始备份,直到您确定可以接受为止)。然后,我们记录详细信息并通过关闭文件和连接进行一些良好的内务处理。

fp = open(filename_opt, 'rb')

ftp.storbinary('STOR %s' % os.path.basename(filename_opt), fp, 1024)

fp.close()

org_size = os.path.getsize(filename)

opt_size = os.path.getsize(filename_opt)

logfile.write(today + " - " + name + "Org: " + str(org_size/1024)kb + " Opt: " + str(opt_size/1024)kb + str((opt_size-org_size)/org_size*100) + "% savings")

ftp.quit()

logfile.close()

就是这样!现在是时候自动化了!

自动压缩

我可以向您展示两个自动化此过程的选项。晚上11:30运行...

  1. 宝塔设置计划任务

  1. 如果您使用的是 Linux 发行版或 MacOS,请通过您的 cronjob 系统在本地自动化它。见下文:

幸运的是,Linux 已经通过使用 crontab 为我们提供了一个解决方案。crontab 存储脚本条目,您可以在其中指定何时执行它们(如调度程序)。在如何安排脚本(一天中的任何时间、星期几、月中的某一天等)方面,您有很大的灵活性。

但首先,如果你要走这条路,你应该在脚本的最顶部添加一个 shebang,它告诉 Linux 使用 Python3 运行脚本:

#!/usr/bin/python3

现在回到 crontab!要打开它并向 crontab 添加条目,请运行以下命令:

crontab -e

它可能会在 vi 编辑器中打开 crontab 文件。在文件底部的空白行上,键入下面的代码。此代码将在每周日的午夜运行脚本。要将时间更改为其他时间,请使用此 cronjob 时间编辑器。使用脚本路径进行自定义。

0 0 * * SUN /usr/bin/python3 PATH_TO_SCRIPT/filename.py

如果要创建日志文件以记录每次运行脚本的时间,可以改用该文件。使用脚本路径进行自定义。

0 0 * * SUN /usr/bin/python3 PATH_TO_SCRIPT/filename.py > PATH_TO_FILE/FILENAME.log 2>&1

保存 crontab 文件,您就可以开始了!请注意,您的计算机需要在 cronjob 设置为运行时处于打开状态。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值