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(#换成@)