Python版整站缓存和预缓存,提升网站整体加载速度
时间:2020-12-09 12:36:00 +0800 CST 浏览:814

shell版

之前在张戈博客上面看到使用shell写的一个整站缓存脚本,本来打算拿过来使用,没想到有点小问题。怎么使用缓存请跳转到张戈博客。

#/bin/b…

shell版

之前在张戈博客上面看到使用shell写的一个整站缓存脚本,本来打算拿过来使用,没想到有点小问题。怎么使用缓存请跳转到张戈博客。

#/bin/bash
#进入到网站根目录,请按实际填写
cd /home/wwwroot/zhangge.net/

#从sitemap.xml中取出所有页面地址, 每隔0.5秒请求一次,触发缓存。
for url in $(awk -F"<loc>|</loc>" '{print $2}' sitemap.xml)
do
        wget -O /dev/null  $url
        sleep 0.5
done

将其中的awk命令单独执行

awk -F"<loc>|</loc>" '{print $2}' sitemap.xml
执行结果:
https://www.zwbing.com

Python版

从上面可以看到只输出了第一个网址,后面的都没有输出。我对awk不是很熟悉,所以将其改成了Python版本。

#!/usr/bin/env python
#-*- coding: UTF-8 -*-
'''
Created on 2016年12月7日

@author: 张文兵
mail: bing@zwbing.com
blog: www.zwbing.com
'''

import sys
import urllib2
from xml.dom import minidom
import time

reload(sys)
sys.setdefaultencoding('utf-8')

def get_url(url):
    xml = None
    try:
        response =  urllib2.urlopen(url)
        xml = response.read()
        response.close()
    except:
        pass
    return xml

def main():
    xml = get_url('https://www.zwbing.com/sitemap.xml')

    if xml is None:
        return 1
    dom = minidom.parseString(xml)
    doc = dom.documentElement
    url_arr = doc.getElementsByTagName('loc')
    for i in url_arr:
        url = i.firstChild.data
        get_url(url)
        time.sleep(1)
    return 0

if __name__ == '__main__':
    sys.exit(main())

20161222更新

昨天在nginx上面做了一些防爬虫的过滤,然后对缓存脚本做了一些小的调整,其实就是伪装成浏览器去访问,这样nginx就不会拒绝访问了。

#!/usr/bin/env python
#-*- coding: UTF-8 -*-
'''
Created on 2016年12月7日

@author: 张文兵
mail: bing@zwbing.com
blog: www.zwbing.com
'''

import sys
import urllib2
from xml.dom import minidom
import time

reload(sys)
sys.setdefaultencoding('utf-8')

def get_url(url):
    xml = None
    try:
        send_headers = {
            'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0.2 Safari/602.3.12',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        }
        req = urllib2.Request(url, headers=send_headers)
        response = urllib2.urlopen(req)
        xml = response.read()
        response.close()
    except:
        pass
    return xml

def main():
    xml = get_url('https://www.zwbing.com/sitemap.xml')

    if xml is None:
        return 1
    dom = minidom.parseString(xml)
    doc = dom.documentElement
    url_arr = doc.getElementsByTagName('loc')
    for i in url_arr:
        url = i.firstChild.data
    #print(url)
        get_url(url)
        time.sleep(1)
    return 0

if __name__ == '__main__':
    sys.exit(main())

20170714更新

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Created on 2016年12月7日

@author: 张文兵
mail: bing@zwbing.com
blog: www.zwbing.com
"""
import hashlib
import os
import sys
import urllib2
from xml.dom import minidom
import time

import re

reload(sys)
sys.setdefaultencoding('utf-8')
filename = '/tmp/sitemap.xml'


def get_url(url):
    xml = None
    try:
        send_headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0.2 Safari/602.3.12',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        }
        req = urllib2.Request(url, headers=send_headers)
        response = urllib2.urlopen(req)
        xml = response.read()
        response.close()
    except:
        pass
    return xml


def purge(url):
    _nportprog = re.compile('^(.*)://(.*)$')
    match = _nportprog.match(url)
    if match:
        protocol, host = match.group(1, 2)
        if host and protocol:
            # nginx fastcgi_cache key $scheme$request_method$host$1
            key = "%sGET%s" % (protocol, host)
            md5 = hashlib.md5()
            md5.update(key)
            key_Md5 = md5.hexdigest()
            path = '/tmp/wpcache/%s/%s/%s' % (key_Md5[-1], key_Md5[-3:-1], key_Md5)
            try:
                os.remove(path)
            except OSError:
                pass


def main():
    xml = get_url('http://www.zwbing.com/sitemap.xml')

    if xml is None:
        return 1
    dom = minidom.parseString(xml)
    doc = dom.documentElement
    url_arr = doc.getElementsByTagName('loc')
    for i in url_arr:
        url = i.firstChild.data
        purge(url)
        body = get_url(url)
        if body is None:
            print(url + ' fail')
        else:
            print(url + ' success')
        time.sleep(1)
    return 0


if __name__ == '__main__':
    sys.exit(main())

本次增加在缓存之前清理之前老的缓存,方便在页面调整之后能及时刷新。

添加计划任务

最后将这个脚本添加到周期计划任务里即可

#每天凌晨三点整站缓存
0 3 * * *  /opt/g_cache.py  &>/dev/null

问题总结

20161209

今天开启百度云加速,发现这个脚本并没有让百度cdn也缓存,经过一番折腾后发现,阿里云ecs使用的是自家的dns解析,而解析到的IP是默认线路也就是ecs主机的IP。从而导致只有nginx缓存了全站,但是百度云加速并没有。最后解决办法:将dns设置为114.114.114.114或者是其他非阿里云dns即可,修改完记得ping一下域名看看是被解析到哪里了。我用的是百度云加速cname解析的所以才会遇到这个问题。



如果这篇文章对你有所帮助,可以通过下边的“打赏”功能进行小额的打赏。

本网站部分内容来源于互联网,如有侵犯版权请来信告知,我们将立即处理。


来说两句吧