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实现数通设备端口使用情况监控实例
Jul 15 Python
Python实现备份MySQL数据库的方法示例
Jan 11 Python
使用python实现BLAST
Feb 12 Python
Python基于SMTP协议实现发送邮件功能详解
Aug 14 Python
使用Python进行目录的对比方法
Nov 01 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
Django框架视图函数设计示例
Jul 29 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
python实现人机猜拳小游戏
Feb 03 Python
10张动图学会python循环与递归问题
Feb 06 Python
Python实现机器学习算法的分类
Jun 03 Python
Python获取字典中某个key的value
Apr 13 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 PDO中文乱码解决办法
2009/07/20 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
JS input 数字验证代码
2009/07/30 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
大学生工作推荐信范文
2013/12/02 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
结婚周年感言
2014/02/24 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
高中家长意见怎么写
2015/06/03 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
python之django路由和视图案例教程
2021/07/26 Python
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技
使用 Docker Compose 构建复杂的多容器App
2022/04/30 Servers
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server