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

作者 : admin 本文共3256个字,预计阅读时间需要9分钟 共56人阅读

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

代码:#

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

 

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

# 定义链接和对应的数量
links = {
“https://k7blog.com”: 60,
“https://k7blog.com/a8″: 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://k7blog.com/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 “/a8dog.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 流量。

资源下载此资源仅限VIP下载,请先
客服QQ:1140845961
本资源网每日更新精品源码,宁缺毋滥,只做能用的精品源码。源码大部分为购买淘宝互站上的源码,少部分来自其他论坛的代理源码。均为精品!!目前源码数量还少,VIP价格较低,早上车早赚到!!!源码搭建教程详情请查看:https://yigexueshe.com
黑马源码资源网 » WordPress搭配WP Super Cache + Python脚本实现暴力预缓存 全站静态化

开通会员

QQ联系 购买卡密

copy fly

咨询请飞机或邮箱

欢迎来到黑马源码网,搭建教程请移步:https://yigexueshe.com 若长时间未回复可联系QQ:2212190958/1140845961。本站无在线支付,开通会员请联系飞机/邮箱/QQ,告知管理员账号并开通,感谢支持!