刚学写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
本文介绍了一个使用Python编写的简单程序,旨在备份雅虎博客的文章。该程序通过分类下载每篇博客文章,并将它们保存到本地文件夹中,每个类别对应一个文件夹。程序利用了多种Python库来解析HTML并提取必要的链接。

被折叠的 条评论
为什么被折叠?



