免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6819 | 回复: 2
打印 上一主题 下一主题

给大家一个linux环境下的CU备份脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-13 18:58 |只看该作者 |倒序浏览
是我在xiaosuo的CU博客上找到的.... 看到很多文章丢失的问题, 所以发上来
http://blog.chinaunix.net/u/5251/showart_265499.html

有个问题,就是第一行的路径不同的系统是不一样的,自己找一下你的python在哪里,没装的就装上  , 用命令whereis python查找...

执行就跟SHELL脚本一样的,
xiaosuo@gentux python $ ./cubk http://blog.chinaunix.net/u/5251/

代码如下:
  1. #!/bin/env python
  2. # Copyright (c) xiaosuo <xiaosuo@gmail.com>
  3. # License GPL v2 or above.

  4. import sys
  5. import getopt
  6. import urllib2
  7. import re
  8. import urlparse
  9. import string
  10. import distutils.dir_util
  11. import htmllib
  12. import formatter

  13. class UrlQueue:
  14.         def __init__(self, baseUrl):
  15.                 self.base = baseUrl[0:baseUrl.rfind("/") + 1]
  16.                 self.finished = []
  17.                 self.pending = []

  18.         def hasPending(self):
  19.                 if len(self.pending) > 0:
  20.                         return True
  21.                 else:
  22.                         return False

  23.         def baseUrl(self):
  24.                 return self.base

  25.         def pop(self):
  26.                 url = self.pending.pop()
  27.                 self.finished.append(url)
  28.                 return url

  29.         def append(self, url):
  30.                 absUrl = urlparse.urljoin(self.base, url)
  31.                 baseUrlLen = len(self.base)
  32.                 if len(absUrl) <= baseUrlLen or absUrl[0:baseUrlLen] != self.base:
  33.                         return False
  34.                 url = absUrl[baseUrlLen:]
  35.                 for e in self.finished:
  36.                         if (url == e):
  37.                                 return False
  38.                 for e in self.pending:
  39.                         if (url == e):
  40.                                 return False
  41.                 self.pending.append(url)
  42.                 return True

  43. class UrlFilter(htmllib.HTMLParser):
  44.         def __init__(self):
  45.                 htmllib.HTMLParser.__init__(self, formatter.NullFormatter())
  46.                 self.hrefList = []

  47.         def anchor_bgn(self, href, name, type):
  48.                 self.hrefList.append(href)

  49.         def clear(self):
  50.                 self.hrefList = []

  51. class Grabber:
  52.         def __init__(self, initUrl):
  53.                 self.initUrl = initUrl
  54.                 self.urlQueue = UrlQueue(initUrl)
  55.                 self.urlFilter = UrlFilter()

  56.         def run(self):
  57.                 self.urlQueue.append(self.initUrl)
  58.                 i = 0
  59.                 while True:
  60.                         listUrl = "article_0_%d.html" % i
  61.                         absUrl = urlparse.urljoin(self.urlQueue.baseUrl(), listUrl)
  62.                         print "Fetching %s" % absUrl
  63.                         page = urllib2.urlopen(absUrl).read()
  64.                         self.urlFilter.clear()
  65.                         self.urlFilter.feed(page)
  66.                         self.urlFilter.close()
  67.                         valid = False
  68.                         for url in self.urlFilter.hrefList:
  69.                                 self.urlQueue.append(url)
  70.                                 if url[0:8] == "showart_":
  71.                                         valid = True
  72.                         if not valid:
  73.                                 break
  74.                         file(listUrl, "w").write(page)
  75.                         i = i + 1
  76.                 while self._grab():
  77.                         pass

  78.         def _grab(self):
  79.                 if not self.urlQueue.hasPending():
  80.                         return False
  81.                 url = self.urlQueue.pop()
  82.                 absUrl = urlparse.urljoin(self.urlQueue.baseUrl(), url)
  83.                 print "Fetching %s" % absUrl
  84.                 page = urllib2.urlopen(absUrl).read()
  85.                 pos = url.rfind("/")
  86.                 if pos != -1:
  87.                         distutils.dir_util.mkpath(url[0:pos])
  88.                 file(url, "w").write(page)
  89.                 pos = url.rfind(".")
  90.                 if pos == -1:
  91.                         return True
  92.                 if string.lower(url[pos+1:pos+4]) != "htm":
  93.                         return True
  94.                 self.urlFilter.clear()
  95.                 self.urlFilter.feed(page)
  96.                 self.urlFilter.close()
  97.                 for url in self.urlFilter.hrefList:
  98.                         self.urlQueue.append(url)
  99.                 return True

  100. def showHelp(prg):
  101.         print "CUBlog backup script.\n"
  102.         print "Usage: %s [option]... initUrl" % prg
  103.         print "Options:"
  104.         print "  -h, --help            Show the help information"

  105. if __name__ == "__main__":
  106.         baseUrl = "";

  107.         # parse the arguments
  108.         try:
  109.                 (opts, args) = getopt.getopt(sys.argv[1:], "h", \
  110.                                 ["help"])
  111.         except getopt.GetoptError:
  112.                 print "Wrong command line arguments."
  113.                 showHelp(sys.argv[0])
  114.                 sys.exit(1)
  115.         for (o, a) in opts:
  116.                 if o in ("-h", "--help"):
  117.                         showHelp(sys.argv[0])
  118.                         sys.exit(0)
  119.         if len(args) == 0:
  120.                 showHelp(sys.argv[0])
  121.                 sys.exit(1)
  122.         url = args[0]
  123.         if url.rfind("/") == len(url) - 1:
  124.                 url += "index.html"
  125.         Grabber(url).run()
复制代码



当然可以另外写个SHELL程序,免得每次都要去输入你的网址,如下:
  1. #!/bin/sh

  2. #只要注意你的路径就对了,很简单吧,但方便了许多
  3. ./cubk http://blog.chinaunix.net/u/5251/
复制代码

[ 本帖最后由 zuii 于 2008-9-2 13:58 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-15 11:47 |只看该作者
support you

论坛徽章:
0
3 [报告]
发表于 2008-01-21 21:15 |只看该作者
严重支持~!谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP