您的位置:首页 > 其它

下载天涯的文章

2013-10-14 23:08 225 查看
写了个下载天涯文章的Python脚本,有点乱,效率很低,单线程,用正则表达式拼起来的。

能简单的判断一些是不是作者与网友聊天的帖子,也会有失误,而且很多!!!!

有时候会卡死,我的解决办法是重新来一次……汗

# -*- coding: utf-8 -*-
import urllib
import urllib2
import re,os

def cn(s):
return s.decode("utf-8").encode("gbk")

def getUrlContent(url):
return urllib2.urlopen(url).read()

def getFirst(cont):
p1 = re.findall('''<div class="bbs-content clearfix">(.+?)</div>''',cont,re.DOTALL)
if len(p1)>0:
return p1[0]
else:
return ""

def getNextPageUrl(cont):
p1 = re.findall('''<a href="(.+?)" class="js-keyboard-next">下页</a>''',cont)
if len(p1)>0:
return "http://bbs.tianya.cn"+p1[0]
else:
return None

def getAuthor(cont):
p1 = re.findall('''<meta name="author" content="(.+)">''',cont)
if len(p1)>0:
return p1[0]

def getTitle(cont):
p1 = re.findall('''<span class="s_title"><span style="font-weight:400;">(.+?)</span>''',cont)
if len(p1)>0:
return p1[0]

def getOnePage(cont,author,fp):
t=""
n=0
#print cont
p='''<div class="atl-item".+?uname="(.+?)">.+?<span>(时间.+?)</span>.+?<div class="bbs-content">(.+?)</div>'''
p1 = re.findall(p,cont,re.S)
#print p1
if len(p1)>0:
for t in p1:
if t[0]==author:
if re.findall("[^-]+?-----------------------------[^-]*?",t[2])==[] and len(t[2])>512:
fp.writelines("<hr/>%s<br/>%s"%(t[1],t[2]))

def main(url):
n=0
author=""
print url
cont=getUrlContent(url)
if cont<0:return
print 'open OK'
author=getAuthor(cont)
if author<0:
print "url error"
return
title = getTitle(cont)
if author<0:
print "url error"
return
time=re.findall("<span>(时间:.+?)</span>",cont)[0]
print 'title:',cn(title)
print 'author:',cn(author)
print 'time:',cn(time)
while 1:
if n>0:
fn="%s[%d].htm"%(cn(title),n)
else:
fn="%s.htm"%cn(title)
if os.path.isfile(fn):
print "File %s already exists!"%fn
n=n+1
else:
break

fp=open(fn,'w')
fp.writelines('''<html>
<head>
<meta charset="utf-8"/>
<title>%s</title>
</head>
<body>'''%(title))
fp.writelines("【%s】<br/>【%s】\n<hr/>%s<br/>"%(title,author,time))
fp.writelines(getFirst(cont))
n=1
while 1:
print "page:%d"%n
getOnePage(cont,author,fp)
url=getNextPageUrl(cont)
if url!=None:
cont=getUrlContent(url)
n=n+1
else:
break
fp.writelines('''</body>
</html>
''')
fp.close()
print "download ok"

if __name__ == '__main__':
url=raw_input('input url:')
main(url)


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: