新浪博客備份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('按回車鍵退出...')
相關文章
相關標籤/搜索