windows中有计划任务管理器,可以定期执行某些操作。程序设想是每天由系统时间触发,每天定时自动执行网页检查,如果有新的链接,就执行自动备份任务。
前面计划任务管理的设定不赘述。前面有编辑环境变量,设置bat文件做脚本的介绍。
这里主要是将如何检测有新的网页。本例中使用了shelve模块来保存变量。也就是说每次下载完会进行一次登记。下次看看有没有登记,有登记的就不备份,没登记的就是新的需要下载的内容了。shelve还保存了一个最后下载时间的变量。
从实验结果看,博主设置是9:30分20秒执行任务。shelve变量正好是这个时间,所以定期执行是成功的。
"""定期下载备份网站文件"""
import shelve
import requests, bs4, re
import datetime
def setFileName(linkHref):
path = "e:\\analectsHtmlBak\\"
return path + 'bak' + linkHref[-3:] + ".html"
def storeUrl(mainurl, url, fileName):
res = requests.get(mainurl + url)
res.raise_for_status()
try:
htmlFile = open(fileName,'wb')
for chunk in res.iter_content(100000):
htmlFile.write(chunk)
htmlFile.close()
except:
print(url + "可能文件不存在或无法访问,挂彩")
else:
print(url + '已经成功下载')
res.close()
def bakHtmlUrl(url):
shelveFile = shelve.open("e:\\/analectsHtmlBak\\/menuData")
if 'htmlNo' in shelveFile.keys():
htmlNo = shelveFile['htmlNo']
else:
htmlNo = []
countI = 0
model = re.compile('^/\d{3}')
res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text,"html.parser")
Area = soup.find_all(href = model)
for link in Area:
if link['href'] not in htmlNo:
print('有新的网站链接:' + link['href'])
htmlNo.append(link['href'])
storeUrl("http://everyang.org", link['href'], setFileName(link['href']))
countI += 1
else:
print(link['href'] + "网站链接已有备份")
shelveFile['htmlNo'] = htmlNo
shelveFile['lastBakTime'] = datetime.datetime.now()
shelveFile.close()
res.close()
print("备份网站完毕!共下载%s个链接"%(countI))
bakHtmlUrl("http://everyang.org/analects_3/")
shelve备份时间查验是否定期执行