Python实现新浪博客备份的方法


Posted in Python onApril 27, 2016

本文实例讲述了Python实现新浪博客备份的方法。分享给大家供大家参考,具体如下:

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

# -*- coding:UTF-8 -*- #
'''
Created on 2011-12-18
@author: Ahan
'''
import re
import sys
import os
import time
import socket
import locale
import datetime
import codecs
from urllib import urlopen
#正则表达式定义
#匹配博文目录链接
pattern1=u"""<a href="(http:.*?)">博文目录</a>"""
prog1 = re.compile(pattern1)
#匹配博文标题链接
pattern2=u"""<a title="(.*?)" target="_blank" href="(.*?)">.*?</a>"""
prog2=re.compile(pattern2)
#匹配下一页链接
pattern3=u"""<a href="([^"]+)" title="[^"]+">下一页"""
prog3=re.compile(pattern3)
#匹配正文部分
pattern4=u"""<!--博文正文 begin -->[\\s\\S]*?<!-- 正文结束 -->"""
prog4=re.compile(pattern4)
#匹配正文图片链接
pattern5=u"""(src="[^"]+"( real_src ="([^"]+)"))"""
prog5=re.compile(pattern5)
def read_date_from_url(url):
  """以Unicode形式返回从url上读取的所有数据
  """
  try:
    data = ""
    request = urlopen(url)
    while True:
      s = request.read(1024)
      if not s:
        break
      data += s
    return unicode(data)
  except:
    print '读取数据时出错'
    print "Unexpected error:", sys.exc_info()[0],sys.exc_info()[1]
    return None
  finally:
    if request:
      request.close()
def save_to_file(url,filename,blog_address):
  """url为博文地址,filename为要保存的文件名,默认后缀为html
  """
  #如果文件夹不存在则创建文件夹
  if os.path.exists(blog_address)==False:
    os.makedirs(blog_address)
  #去掉文件名中的非法字符
  filename=ReplaceBadCharOfFileName(filename)
  file_no=0
  while os.path.isfile(blog_address+'/'+filename+'.html')==True:
    filename=filename+'('+file_no.__str__()+')'
    file_no+=1
  text = read_date_from_url(url)
  text=_filter(text)
  #将图片保存到本地
  result=prog5.findall(text)
  i=1
  for pic in result:
    folder=blog_address+'/'+filename+'/'
    pic_name='image'+i.__str__()+'.gif' 
    if os.path.exists(folder)==False:
      os.makedirs(folder)
    try:
      url_file = urlopen(pic[2])
      pic_file = codecs.open(folder+pic_name,'wb')
      while True:
        s = url_file.read(1024)
        if not s:
          break
        pic_file.write(s)
      pic_file.close()
      url_file.close()
    except:
      print '噢,保存图片的时候出现问题了,跳过此张图片...'
      print "Unexpected error:", sys.exc_info()[0],sys.exc_info()[1]
    else:
      print '保存图片成功...'
      #替换正文中的图片地址
      text=text.replace(pic[0],unicode("src=\"" + filename + "/" + pic_name + "\"" + pic[1]),1)
      i=i+1
  blog_file = codecs.open(blog_address+'/'+filename+'.html','wb')
  blog_file.write(text)
  blog_file.close()
#提取文本中的正文部分
def _filter(t):
  """提取文本中的正文部分,返回Unicode形式的字符串
  """
  result=prog4.search(t)
  if result is not None:
    return u'<html><head></head><body>' + unicode(result.group()) + u'</dody></html>'
  else:
    raise Exception('噢,提取正文出错了……')
#去掉文件名的不合法字符 
def ReplaceBadCharOfFileName(filename):
  filename=filename.replace(" ","")
  filename=filename.replace("\\", "")
  filename=filename.replace("/", "")
  filename=filename.replace(":", "")
  filename=filename.replace("*", "")
  filename=filename.replace("?", "")
  filename=filename.replace("<", "")
  filename=filename.replace(">", "")
  filename=filename.replace("|", "")
  filename=filename.replace("&","")
  filename=filename.replace(";","")
  return filename
#主函数
if __name__ == '__main__':
  #准备阶段
  blog_no=1#博文编号
  begin=1#起始博文
  end=0#结束博文
  page=0#页码
  saved=0#成功保存的篇数
  timeout = 60*5#超时设为5分钟
  socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置
  blog_address=raw_input("请输入您的博客地址(输入最后部分即可,比如您的博客地址是http://blog.sina.com.cn/jiangafu,只要输入jiangafu):")
  blog_address=blog_address.replace('\r','')
  begin=raw_input('从第几篇开始:')  
  begin=locale.atoi(begin)
  while begin<=0:
    begin=raw_input('请输入大于0的数:')
    begin=locale.atoi(begin)
  end=raw_input('到第几篇结束(到最后请输入0):')
  end=locale.atoi(end)
  while end<0:
    end=raw_input('请输入大于等于0的数:')
    end=locale.atoi(end)
  if end==0:
    print '您的博客地址是:http://blog.sina.com.cn/'+blog_address+',保存第'+begin.__str__()+'篇到最后一篇博文'
  else:
    print '您的博客地址是:http://blog.sina.com.cn/'+blog_address+',保存第'+begin.__str__()+'篇到第'\
       +end.__str__()+'篇的博文'
  starttime = datetime.datetime.now()
  text=read_date_from_url('http://blog.sina.com.cn/'+blog_address)
  time.sleep(0.5)
  #提取“博文目录”的url
  result = prog1.search(text)
  if result is not None:
    print '博文目录地址:' , result.group(1)
    text=read_date_from_url(result.group(1))
    time.sleep(0.4)
  else:
    print '提取博文目录地址失败'
    #终止程序运行
    sys.exit()
  #查找每一页的全部博文,分析、提取、保存 
  while True:
    page+=1
    print '开始备份第' , page , '页'
    #匹配该页的所有博文地址
    result=prog2.findall(text)
    #循环下载本页每篇博文
    for blog in result: 
      if blog_no < begin:
        blog_no += 1
      elif end != 0 and blog_no > end:
        break
      else:
        try:
          save_to_file(blog[1],unicode(blog[0]),blog_address)
        except:
          print '噢,保存第',blog_no,'篇博文',blog[0],'的时候出现问题了,跳过...'
          blog_no += 1
          print "Unexpected error:", sys.exc_info()[0],sys.exc_info()[1]
        else:
          print '成功保存了第', blog_no, '篇博文:', blog[0]
          blog_no += 1
          saved += 1
          time.sleep(0.4)
    #判断是否有下一页
    result = prog3.search(text)
    if result is not None:
      text = read_date_from_url(result.group(1))
    else:
      print '这是最后一页'
      break
  print '博客备份完成一共备份',saved,'篇博文'
  print '共用时:',datetime.datetime.now() - starttime
  raw_input('按回车键退出...')

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中Genarator函数用法分析
Apr 08 Python
python编写简单爬虫资料汇总
Mar 22 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
python爬取微信公众号文章
Aug 31 Python
在双python下设置python3为默认的方法
Oct 31 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
wxPython实现绘图小例子
Nov 19 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
python代码实现图书管理系统
Nov 30 Python
Django一小时写出账号密码管理系统
Apr 29 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 #Python
Python判断文本中消息重复次数的方法
Apr 27 #Python
python脚本监控docker容器
Apr 27 #Python
Python多进程同步简单实现代码
Apr 27 #Python
Python对象转JSON字符串的方法
Apr 27 #Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 #Python
Python实现二维有序数组查找的方法
Apr 27 #Python
You might like
PHP 图片文件上传实现代码
2010/12/29 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
xtree.js 代码
2007/03/13 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
js性能优化技巧
2015/11/29 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
vue跨域解决方法
2017/10/15 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
python 基于TCP协议的套接字编程详解
2019/06/29 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python字符串下标与切片及使用方法
2020/02/13 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
校企合作协议书
2014/04/16 职场文书
财务会计专业自荐书
2014/06/30 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
redis 解决库存并发问题实现数量控制
2022/04/08 Redis
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS