WordPress搭配WP Super Cache + Python脚本实现暴力预缓存 全站静态化

2024-03-25 1,129 0

WordPress有定时任务机制,WP Super Cache插件就是通过这个定时任务来进行预缓存,在我使用的过程中预缓存一次最多生成十几个页面,并且在下一次定时任务运行的时候才会继续生成,效率是非常的慢,如果一直挂着WP Super Cache预缓存页面可以一直自动生成,但是效率还是太慢了,于是我写了一个简单的python脚本并且可以把WP Super Cache不能预缓存的分类页面也能缓存上。

代码:

当然不管怎么优化,我们还是需要一台性能强悍的vps云服务器,这里我推荐伍六七云https://www.vps567.com/ 香港2H2G 5M服务器只需要20元

首先我们的服务器需要python3环境,并且我们的WordPress安装好了WP Super Cache插件,把下面的代码编辑成page.py,用于缓存分类的分页。

import os
import requests
import time
from concurrent.futures import ThreadPoolExecutor
from itertools import islice

# 定义链接和对应的数量
links = {
    "https://www.4awl.net": 60,
    "https://www.4awl.net/vpspingce": 10,
    "https://www.4awl.net/kaiyuanruanjian": 5,
    "https://www.4awl.net/zixuechuangye": 10,
    "https://www.4awl.net/yuanmafenxiang": 10,
    "https://www.4awl.net/yuanmafenxiang/phpyuanma": 10,
    "https://www.4awl.net/yuanmafenxiang/xiaochengxuyuanma": 5,
    "https://www.4awl.net/yuanmafenxiang/youxiyuanma": 5,
    "https://www.4awl.net/yuanmafenxiang/javayuanma": 5,
    "https://www.4awl.net/ruanjianfenxiang": 10,
    "https://www.4awl.net/ruanjianfenxiang/windowsruanjian": 10,
    "https://www.4awl.net/ruanjianfenxiang/anzhuoruanjian": 5,
    "https://www.4awl.net/jishufenxiang": 30,
    "https://www.4awl.net/jishufenxiang/loudongfenxi": 15,
    "https://www.4awl.net/jishufenxiang/wangluoanquan": 25,
    "https://www.4awl.net/qitafenxiang": 10
}

# 生成链接
all_links = []
for link, count in links.items():
    for i in range(1, count + 1):
        page_link = f"{link}/page/{i}" if i > 1 else link
        all_links.append(page_link)

# 将链接分组以便后续并发访问
def chunk(it, size):
    it = iter(it)
    return iter(lambda: tuple(islice(it, size)), ())

# 访问链接的函数
def visit_url(url):
    try:
        response = requests.get(url)
        print(f"Visited: {url}, Status Code: {response.status_code}")
    except Exception as e:
        print(f"Failed to visit: {url}, Error: {e}")

# 设置并发数和延迟
concurrency = 10  # 并发数
delay = 1  # 延迟时间(秒)

# 创建线程池并并发访问链接
with ThreadPoolExecutor(max_workers=concurrency) as executor:
    for chunked_links in chunk(all_links, concurrency):
        futures = [executor.submit(visit_url, url) for url in chunked_links]
        time.sleep(delay)

# 将链接写入到page.txt文件中
with open("page.txt", "w") as f:
    for link in all_links:
        f.write(link + "\n")

把代码中的链接替换成你的分类页就可以了,每一行的分类页后面数字就是你的分页数量。

比如我的分类有10页,那么我可以设置15页,后续文章多了分页多了不会缓存不上。

在把下面的代码添加到url.py:

import requests
import xml.etree.ElementTree as ET
import threading
import time

# 设置并发数和请求间隔
CONCURRENT_REQUESTS = 10
REQUEST_INTERVAL = 1  # seconds

def fetch_sitemap(url):
    """
    获取网站地图内容
    """
    response = requests.get(url)
    if response.status_code == 200:
        return response.content
    else:
        print(f"Failed to fetch sitemap from {url}")
        return None

def extract_sitemap_urls(sitemap_content):
    """
    从网站地图内容中提取子地图链接
    """
    urls = []
    if sitemap_content:
        try:
            root = ET.fromstring(sitemap_content)
            for loc in root.findall(".//{http://www.sitemaps.org/schemas/sitemap/0.9}loc"):
                urls.append(loc.text)
        except ET.ParseError as e:
            print("Error parsing sitemap XML:", e)
    return urls

def fetch_urls_from_sitemap(url):
    """
    从网站地图中提取网页链接
    """
    sitemap_content = fetch_sitemap(url)
    if sitemap_content:
        return extract_sitemap_urls(sitemap_content)
    else:
        return []

def fetch_url(url):
    """
    发送请求到网站链接
    """
    try:
        response = requests.get(url)
        # 在这里处理你想要的响应内容
        print("Fetched:", url)
    except requests.RequestException as e:
        print("Error fetching", url, ":", e)

def main():
    sitemap_url = "https://www.4awl.net/wp-sitemap.xml"  # 替换为你的网站地图链接
    sitemap_urls = fetch_urls_from_sitemap(sitemap_url)
    all_urls = []

    # 从所有子地图中提取网页链接
    for url in sitemap_urls:
        all_urls.extend(fetch_urls_from_sitemap(url))

    # 写入到url.txt文件
    with open('url.txt', 'w') as f:
        for url in all_urls:
            f.write(url + '\n')
    print("Urls extracted and written to url.txt file.")

    # 并发请求的线程函数
    def fetch_urls(urls):
        while urls:
            url = urls.pop(0)
            fetch_url(url)
            time.sleep(REQUEST_INTERVAL)

    # 以CONCURRENT_REQUESTS个线程并发发送请求
    threads = []
    for _ in range(CONCURRENT_REQUESTS):
        thread = threading.Thread(target=fetch_urls, args=(all_urls,))
        thread.start()
        threads.append(thread)

    # 等待所有线程完成
    for thread in threads:
        thread.join()

if __name__ == "__main__":
    main()

把地图地址替换成你的地图地址,会自动抓取网站的全部链接进行预缓存。

如果我们在宝塔添加定时任务选择shell脚本:

python3 /你的目录/page.py
python3 /你的目录/url.py

可能会出现一个报错:

Traceback (most recent call last):
  File "/4apage.swap.py", line 2, in <module>
    import requests
ModuleNotFoundError: No module named 'requests'

这是因为宝塔的定时任务是使用宝塔的python环境,没有安装requests模块,我们只需要随便添加一个shell定时任务脚本:

pip3 install requests

执行一下,然后再重新添加定时任务就可以了。

注意:

如果你的域名有cdn或者防火墙,频繁的预缓存可能会出现被拦截的情况,请把IP加入白名单 并且把修改host文件,把域名指向源IP或者127.0.0.1,这样就不会消耗cdn流量。


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

开源短网址应用【Sink】:百分百在 CloudFlare 上运行
离线 IP 定位库,微秒级查询 99.9% 准确率!
一个开源有趣的聊天室项目!颜值高跨平台!
全自动录播、分p投稿工具 biliup v0.4.68 支持B站抖音快手虎牙等主流直播
扫描反代Cloudflare的IP 给网站CDN加速 免费制作自己的CDN加速
小雅alist+emby 搭建一个家庭影音流媒体服务 T级资源无需下载高速播放

发布评论