为了能让 CDN 提前预热缓存文件,我用 Bing 写了一段自动访问网站的 Python 脚本

CDN 可以加速分发静态文件,所以当动态网站生成的 HTML 静态文件被 CDN 缓存后,网站的访问速度可以提高许多,实际效果可以参考:当 WP Super Cache 生成的静态 HTML 文件被 CDN 缓存后……

问题

但是这中间有个问题,只有访客访问某一页面之后,服务器本地才会创建缓存文件,也只有访问之后,CDN 才会把缓存文件分发到节点。

对于自动创建缓存的需求,以 WP Super Cache 为例,可以将缓存模式设置为 预缓存;但是,如果没有人访问,预缓存的文件也不会同步到 CDN,除非用 CDN 提供商的刷新和预热功能,但那些一般都有额度限制。

CDN 加速网络分发

思路

如何才能将这两步结合起来一并处理呢?

耕读君有一台很老的笔记本电脑,换上固态硬盘之后安装了 Ubuntu Server 系统,保持全天候运行,作为家庭服务器使用。正好可以写一个 Python 脚本,解析网站的 sitemap,再分别访问文章链接,这样就能触发缓存插件生成 HTML 静态文件,又可以让 CDN 加载,实现预热效果。脚本放在电脑上,设置好定时运行,岂不美哉?

写代码

网站地图是插件生成的,后缀是 .xml。网上有许多 Python 解析 xml 的教程,不过都是解析本地文件,耕读君试过之后觉得太麻烦,突然想到 ChatGPT 可以写代码,那么集成 ChatGPT 的 Bing 应该也可以。

把问题描述给 Bing 之后,本以为它不会给出代码,或者给出的代码可能不准确,然而 3 秒钟过后,我的下巴已经掉地上了——

代码工整、备注清晰、运行成功!!

集成 ChatGPT 的 Bing

牛逼牛逼,不过我忘记截图了。把代码贴到 VS Code 里面,根据自己的需求再简单改了下,完美实现需求。

#!/usr/bin/python3

import requests
from bs4 import BeautifulSoup
import random
import time


def parse_sitemap(url):
    # 发送请求,获取 xml 内容
    response = requests.get(url)
    # 用 BeautifulSoup 解析 xml
    soup = BeautifulSoup(response.content, "xml")
    # 创建一个空集合,用来存储 html 链接
    links = set()
    # 找到所有的 <loc> 标签,它们包含了 html 链接
    locs = soup.find_all("loc")
    # 遍历每个 <loc> 标签,把它们的文本内容添加到集合里
    for loc in locs:
        links.add(loc.text)
    # 返回集合
    return links


# 索引页面集合
index_links = [
    "https://your_site/sitemap_index.xml",
    "https://your_site/sitemap_index.xml",

]


# 获取所有 xml 链接
xml_links = list()
for index in index_links:
    xml_links.extend(list(parse_sitemap(index)))

# 获取所有页面链接
html_links = list()
for xml_link in xml_links:
    html_links.extend(list(parse_sitemap(xml_link)))

# 访问所有 html 链接
for html_link in html_links:
    if html_link.endswith('.html'):
        try:
            x = requests.get(html_link)
        except:
            continue
        time.sleep(random.randint(1,3))

人工智能,牛逼!!

定时任务

把脚本上传到家庭服务器,尝试运行,输出结果正常。

于是,运行 crontab -e 编辑定时任务,设定每两天凌晨 4 点 40 分运行脚本:

40 4 */2 * * python3 /home/louis/prefetch/main.py > /dev/null 2>&1

过两天查看 Crontab 日志就行了。

Crontab 使用方法可以参考:利用 Linux Crontab,每天定时重启 Nginx / MySQL / PHP 服务,避免内存泄漏导致内存占用率过高

耕读君
耕读君

一个筋斗十万八千里,说明上云好啊

文章: 197

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注