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实现dnspod自动更新dns解析的方法
Feb 14 Python
python编写网页爬虫脚本并实现APScheduler调度
Jul 28 Python
python任务调度实例分析
May 19 Python
python编写简单爬虫资料汇总
Mar 22 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
Python configparser模块常用方法解析
May 22 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 Python
python如何控制进程或者线程的个数
Oct 16 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
详解javascript对数组和json数组的操作
2019/04/15 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
Python 分享10个PyCharm技巧
2019/07/13 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
Java语言程序设计测试题选择题部分
2014/04/03 面试题
J2EE面试题
2016/03/14 面试题
党员承诺践诺书
2014/05/20 职场文书
超市店庆活动方案
2014/08/31 职场文书
作文评语怎么写
2014/12/25 职场文书
导师对论文的学术评语
2015/01/04 职场文书
2015年幼师工作总结
2015/04/28 职场文书
三下乡活动心得体会
2016/01/23 职场文书
导游词之西安骊山
2019/12/20 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
python 管理系统实现mysql交互的示例代码
2021/12/06 Python