刚学写python编程,就写个程序练练,用来保存雅虎博客文章的。第一次用python,觉得python没有传说中那么容易学容易写,写个程序都弄到头都大了:(
共3个文件
一个是dive into python里的urllister.py
blog.py:
#!/usr/bin/python #-*-coding:utf-8-*- #用来保存网页blog """ 备份yahoo博客 作者:trouble.li blog [userName] [directory] userName:博客用户名称,即如果邮箱是 abc@yahoo.com.cn,则userName就是abc directory指定下载页面存放的路径 程序按文章分类来下载页面,并为每一个类别建立文件夹 参考了http://zeroliu.blogdriver.com/zeroliu/1189130.html """ import xmlrpclib import os.path import os import codecs import traceback import urllib,urllib2,urllister from HTMLParser import HTMLParser from htmlentitydefs import * import sys from myhtml import myParser2 from myhtml import myParser3 from myhtml import myParser4 #初始化一些变量,要修改 usr='trouble.li' dir='/home/trouble/python/' urlBase='http://i.cn.yahoo.com/' encoding='gb2312' preUrl='' #保存前一url catagory={} #cd函数用于判断路径是否正确,如正确则改变当前工作路径 def cd(ss): try: os.chdir(ss) print '改变工作目录为'+ss return 0 except: print '保存路径有误,请重新输入' return 1 #保存URL到一个文件,返回html def saveUrlToFile(url,filename): #访问URL usock=urllib.urlopen(url) html=usock.read() usock.close() #以title作为文件名 if filename=='': htmlpaser=myParser2() htmlpaser.feed(html) filename=htmlpaser.title.split('_')[0] #print '以title作为文件名,title:'+htmlpaser.title htmlpaser.close() #保存文件 fp=file(filename,'wb') fp.write(html) fp.close(); print 'saveUrl(%s) to File %s'%(url, filename) #返回 return html #对url进行筛选 def addUrl(url,blogs): if '/blog/p' in url and '#' not in url: # and '?' not in url: global preUrl if preUrl==url:return #避免保存同一个页面多次 preUrl=url blogs.append(url) print '增加一篇文章:'+url #取得博客文章分类 def getCategory(): usock=urllib.urlopen(urlBase) html=usock.read() usock.close() htmlparser=myParser3() htmlparser.feed(html) catagory.update(htmlparser.cata) #取得某分类所有文章链接 def getAllUrl(l_parser,blogs): l_url={} for url in l_parser.urls: if '/blog/l_' in url: usock=urllib.urlopen(url+'&bv=t') #bv=t:表示标题模式 html=usock.read() usock.close() htmlparser=myParser4() htmlparser.url.clear() #为什么一定要这句? htmlparser.feed(html) l_url.update(htmlparser.url) else: addUrl(url,blogs) for url in l_url.values(): blogs.append(url) print '增加一篇文章:'+url if __name__=='__main__': if sys.argv[1:]:usr=sys.argv[1] if sys.argv[2:]:dir=sys.argv[2] dir=dir+usr+'-yahoo' urlBase=urlBase+usr+'/blog/' #保存目录 if not os.path.exists(dir): print dir os.mkdir(dir) cd(dir) #catalogs={} #pages=[1,11,21,31] #for i in pages: # catalogs['l_'+repr(i)+'/']='0摘要页面'+repr(i) #通过分类来整理 count=0 getCategory() for cata in catagory.keys(): #print cata #html=saveUrlToFile(urlBase+cata,"0分类-"+catagory[cata]) #为每一个分类创建一个目录 tempdir=dir+'/'+catagory[cata] if not os.path.exists(tempdir): print tempdir os.mkdir(tempdir) cd(tempdir) usock=urllib.urlopen(urlBase+cata+'&bv=t') #bv=t:表示标题模式 html=usock.read() #count+=1 parser=urllister.URLLister() parser.feed(html) parser.close() #每一个分类可能有多页 count1=0 blogs=[] #取出这个分类的所有文章链接放到blogs里 getAllUrl(parser,blogs) for url in blogs: saveUrlToFile(url,'') count+=1 count1+=1 print '/n----本类别有 %d 篇文章/n' %(count1) print '/n----Finished! Total %d posts be saved ' %(count)myhtml.py:
#coding:utf-8 import HTMLParser from sgmllib import SGMLParser #处理html内容 class myParser(HTMLParser.HTMLParser): is_title='' title='' def __init__(self): HTMLParser.HTMLParser.__init__(self) def handle_starttag(self,tag,attrs): #重新定义处理标签函数 if tag=='title': self.is_title=1 def handle_endtag(self,tag): if tag=='title': self.is_title='' def handle_data(self,data): if self.is_title: self.title=data print data; class myParser2(SGMLParser): """ 用于处理网页title """ is_title='' title='' def start_title(self,attrs): #重新定义处理标签函数 self.is_title=1 def end_title(self): self.is_title='' def handle_data(self,text): if self.is_title: #text=text.decode('gb2312','ignore').encode('utf-8') self.title=text #print text; class myParser3(SGMLParser): """ 用于处理标签 """ is_cata='' cata={} href='' def handle_data(self,text): if self.is_cata: #获得分类名称 print text self.href=self.href.split('/')[-1] self.cata[self.href]=text self.is_cata='' self.href='' def start_a(self,attrs): for tuples in attrs: if tuples[0]=='href': if "/blog/?sc" in tuples[1]: print '找到一个分类:' self.is_cata=1 self.href=tuples[1] #获得分类的url class myParser4(SGMLParser): """ 用于处理标签 """ url={} def start_a(self,attrs): for tuples in attrs: if tuples[0]=='href': if "/blog/p" in tuples[1] and '#' not in tuples[1]:# and '?' not in tuples[1]: temp=tuples[1].split('/')[-2] #print 'temp',temp self.url[temp]=tuples[1] #获得分类的url