zoukankan      html  css  js  c++  java
  • 下载天涯的文章

    写了个下载天涯文章的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】
    <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)
    

      

  • 相关阅读:
    ie6内存泄漏问题的解决
    精简版拖动
    【转】在ASP.Net中写系统日志
    转 集中遍历遍历datatable的方法
    水晶报表字段为空时设置默认值
    数据库一种IN查询
    两种获得路径的测试
    整理——ASP.net UTF8支持
    Subversion svnserve 服务配置 整理
    [转自CSDN] SQL基础> 约束(CONSTRAINT)
  • 原文地址:https://www.cnblogs.com/fwindpeak/p/3369383.html
Copyright © 2011-2022 走看看