shell版
之前在张戈博客上面看到使用shell写的一个整站缓存脚本,本来打算拿过来使用,没想到有点小问题。怎么使用缓存请跳转到张戈博客。
#/bin/b…
之前在张戈博客上面看到使用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
从上面可以看到只输出了第一个网址,后面的都没有输出。我对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())
昨天在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())
#!/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
今天开启百度云加速,发现这个脚本并没有让百度cdn也缓存,经过一番折腾后发现,阿里云ecs使用的是自家的dns解析,而解析到的IP是默认线路也就是ecs主机的IP。从而导致只有nginx缓存了全站,但是百度云加速并没有。最后解决办法:将dns设置为114.114.114.114或者是其他非阿里云dns即可,修改完记得ping一下域名看看是被解析到哪里了。我用的是百度云加速cname解析的所以才会遇到这个问题。
如果这篇文章对你有所帮助,可以通过下边的“打赏”功能进行小额的打赏。
本网站部分内容来源于互联网,如有侵犯版权请来信告知,我们将立即处理。