新浪博客备份Python脚本

Python2.7.2版本实现,推荐在IDE中运行。


  1. # -*- coding:UTF-8 -*- #
  2. '''
  3. Created on 2011-12-18

  4. @author: Ahan
  5. '''
  6. import re
  7. import sys
  8. import os
  9. import time
  10. import socket
  11. import locale
  12. import datetime
  13. import codecs
  14. from urllib import urlopen

  15. #正则表达式定义
  16. #匹配博文目录链接
  17. pattern1=u"""<a  href="(http:.*?)">博文目录</a>"""
  18. prog1 = re.compile(pattern1)
  19. #匹配博文标题链接
  20. pattern2=u"""<a title="(.*?)" target="_blank" href="(.*?)">.*?</a>"""
  21. prog2=re.compile(pattern2)
  22. #匹配下一页链接
  23. pattern3=u"""<a href="([^"]+)" title="[^"]+">下一页"""
  24. prog3=re.compile(pattern3)
  25. #匹配正文部分
  26. pattern4=u"""<!--博文正文 begin -->[\\s\\S]*?<!-- 正文结束 -->"""
  27. prog4=re.compile(pattern4)
  28. #匹配正文图片链接
  29. pattern5=u"""(src="[^"]+"( real_src ="([^"]+)"))"""
  30. prog5=re.compile(pattern5)

  31. def read_date_from_url(url):
  32.     """以Unicode形式返回从url上读取的所有数据
  33.     """
  34.     try:
  35.         data = ""
  36.         request = urlopen(url)
  37.         while True:
  38.             s = request.read(1024)
  39.             if not s:
  40.                 break
  41.             data += s
  42.         return unicode(data)
  43.     except:
  44.         print '读取数据时出错'
  45.         print "Unexpected error:", sys.exc_info()[0],sys.exc_info()[1]
  46.         return None
  47.     finally:
  48.         if request:
  49.             request.close()
  50.         
  51. def save_to_file(url,filename,blog_address):
  52.     """url为博文地址,filename为要保存的文件名,默认后缀为html
  53.     """
  54.     #如果文件夹不存在则创建文件夹
  55.     if os.path.exists(blog_address)==False:
  56.         os.makedirs(blog_address)
  57.     #去掉文件名中的非法字符
  58.     filename=ReplaceBadCharOfFileName(filename)
  59.     file_no=0
  60.     while os.path.isfile(blog_address+'/'+filename+'.html')==True:
  61.         filename=filename+'('+file_no.__str__()+')'
  62.         file_no+=1
  63.     text = read_date_from_url(url)
  64.     text=_filter(text)
  65.     #将图片保存到本地
  66.     result=prog5.findall(text)
  67.     i=1
  68.     for pic in result:
  69.         folder=blog_address+'/'+filename+'/'
  70.         pic_name='image'+i.__str__()+'.gif' 
  71.         if os.path.exists(folder)==False:
  72.             os.makedirs(folder)
  73.         try:
  74.             url_file = urlopen(pic[2])
  75.             pic_file = codecs.open(folder+pic_name,'wb')
  76.             while True:
  77.                 s = url_file.read(1024)
  78.                 if not s:
  79.                     break
  80.                 pic_file.write(s)
  81.             pic_file.close()
  82.             url_file.close()
  83.         except:
  84.             print '噢,保存图片的时候出现问题了,跳过此张图片...'
  85.             print "Unexpected error:", sys.exc_info()[0],sys.exc_info()[1]
  86.         else:
  87.             print '保存图片成功...'
  88.             #替换正文中的图片地址
  89.             text=text.replace(pic[0],unicode("src=\"" + filename + "/" + pic_name + "\"" + pic[1]),1)
  90.             i=i+1
  91.     blog_file = codecs.open(blog_address+'/'+filename+'.html','wb')
  92.     blog_file.write(text)
  93.     blog_file.close()
  94.     
  95. #提取文本中的正文部分
  96. def _filter(t):
  97.     """提取文本中的正文部分,返回Unicode形式的字符串
  98.     """
  99.     result=prog4.search(t)
  100.     if result is not None:
  101.         return u'<html><head></head><body>' + unicode(result.group()) + u'</dody></html>'
  102.     else:
  103.         raise Exception('噢,提取正文出错了……')

  104. #去掉文件名的不合法字符 
  105. def ReplaceBadCharOfFileName(filename):
  106.     filename=filename.replace("&nbsp;","")
  107.     filename=filename.replace("\\""")
  108.     filename=filename.replace("/""")
  109.     filename=filename.replace(":""")
  110.     filename=filename.replace("*""")
  111.     filename=filename.replace("?""")
  112.     filename=filename.replace("<""")
  113.     filename=filename.replace(">""")
  114.     filename=filename.replace("|""")
  115.     filename=filename.replace("&","")
  116.     filename=filename.replace(";","")
  117.     return filename
  118.     
  119. #主函数

  120. if __name__ == '__main__':
  121.     #准备阶段
  122.     blog_no=1#博文编号
  123.     begin=1#起始博文
  124.     end=0#结束博文
  125.     page=0#页码
  126.     saved=0#成功保存的篇数
  127.     timeout = 60*5#超时设为5分钟
  128.     socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置
  129.     blog_address=raw_input("请输入您的博客地址(输入最后部分即可,比如您的博客地址是http://blog.sina.com.cn/jiangafu,只要输入jiangafu):")
  130.     blog_address=blog_address.replace('\r','')
  131.     begin=raw_input('从第几篇开始:')   
  132.     begin=locale.atoi(begin)
  133.     while begin<=0:
  134.         begin=raw_input('请输入大于0的数:')
  135.         begin=locale.atoi(begin)
  136.     end=raw_input('到第几篇结束(到最后请输入0):')
  137.     end=locale.atoi(end)
  138.     while end<0:
  139.         end=raw_input('请输入大于等于0的数:')
  140.         end=locale.atoi(end)
  141.     if end==0:
  142.         print '您的博客地址是:http://blog.sina.com.cn/'+blog_address+',保存第'+begin.__str__()+'篇到最后一篇博文'
  143.     else:
  144.         print '您的博客地址是:http://blog.sina.com.cn/'+blog_address+',保存第'+begin.__str__()+'篇到第'\
  145.               +end.__str__()+'篇的博文'
  146.     starttime = datetime.datetime.now()
  147.     text=read_date_from_url('http://blog.sina.com.cn/'+blog_address)
  148.     
  149.     time.sleep(0.5)
  150.     #提取“博文目录”的url
  151.     result = prog1.search(text)
  152.     if result is not None:
  153.         print '博文目录地址:' , result.group(1)
  154.         text=read_date_from_url(result.group(1))
  155.         time.sleep(0.4)
  156.     else:
  157.         print '提取博文目录地址失败'
  158.         #终止程序运行
  159.         sys.exit()
  160.     #查找每一页的全部博文,分析、提取、保存 
  161.     while True:
  162.         page+=1
  163.         print '开始备份第' , page , '页'
  164.         #匹配该页的所有博文地址
  165.         result=prog2.findall(text)
  166.         #循环下载本页每篇博文
  167.         for blog in result: 
  168.             if blog_no < begin:
  169.                 blog_no += 1
  170.             elif end != 0 and blog_no > end:
  171.                 break
  172.             else:
  173.                 try:
  174.                     save_to_file(blog[1],unicode(blog[0]),blog_address)
  175.                 except:
  176.                     print '噢,保存第',blog_no,'篇博文',blog[0],'的时候出现问题了,跳过...'
  177.                     blog_no += 1
  178.                     print "Unexpected error:", sys.exc_info()[0],sys.exc_info()[1]
  179.                 else:
  180.                     print '成功保存了第', blog_no, '篇博文:', blog[0]
  181.                     blog_no += 1
  182.                     saved += 1
  183.                     time.sleep(0.4)
  184.         #判断是否有下一页
  185.         result = prog3.search(text)
  186.         if result is not None:
  187.             text = read_date_from_url(result.group(1))
  188.         else:
  189.             print '这是最后一页'
  190.             break
  191.     print '博客备份完成一共备份',saved,'篇博文'
  192.     print '共用时:',datetime.datetime.now() - starttime
  193.     raw_input('按回车键退出...')

转载于:https://my.oschina.net/u/174865/blog/37718

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值