zoukankan      html  css  js  c++  java
  • python爬取百度贴吧帖子

    最近偶尔学下爬虫,放上第二个demo吧

    #-*- coding: utf-8 -*-
    import urllib
    import urllib2
    import re
    
    
    #处理页面标签类
    class Tool:
        #去除img标签,7位长空格
        removeImg = re.compile('<img.*?>| {7}|')
        #删除超链接标签
        removeAddr = re.compile('<a.*?>|</a>')
        #把换行的标签换为
    
        replaceLine = re.compile('<tr>|<div>|</div>|</p>')
        #将表格制表<td>替换为	
        replaceTD= re.compile('<td>')
        #把段落开头换为
    加空两格
        replacePara = re.compile('<p.*?>')
        #将换行符或双换行符替换为
    
        replaceBR = re.compile('<br><br>|<br>')
        #将其余标签剔除
        removeExtraTag = re.compile('<.*?>')
        def replace(self,x):
            x = re.sub(self.removeImg,"",x)
            x = re.sub(self.removeAddr,"",x)
            x = re.sub(self.replaceLine,"
    ",x)
            x = re.sub(self.replaceTD,"	",x)
            x = re.sub(self.replacePara,"
        ",x)
            x = re.sub(self.replaceBR,"
    ",x)
            x = re.sub(self.removeExtraTag,"",x)
            #strip()将前后多余内容删除
            return x.strip()
    
    
    #爬取百度贴吧
    class BDTB:
        #初始化,传入地址,参数
        def __init__(self,baseUrl,seelz,floorTag):
            self.baseURL=baseUrl
            self.seelz='?see_lz='+str(seelz)
            # HTML标签剔除工具类对象
            self.tool = Tool()
            # 全局file变量,文件写入操作对象
            self.file = None
            # 楼层标号,初始为1
            self.floor = 1
            # 默认的标题,如果没有成功获取到标题的话则会用这个标题
            self.defaultTitle = u"百度贴吧"
            # 是否写入楼分隔符的标记
            self.floorTag = floorTag
    
        #传入页码,获取该业帖子的代码
        def getPage(self,pageNum):
            try:
                url=self.baseURL+self.seelz+'&pn='+str(pageNum)
                request=urllib2.Request(url)
                response=urllib2.urlopen(request)
                print url
                #print response.read()
                return response.read()
            except urllib2.URLError,e:
                if hasattr(e,'reason'):
                    print u"连接百度贴吧失败",e.reason
                    return None
    
        #得到帖子的标题
        def getTitle(self,page):
            #访问第一页,得到标题
            pattern=re.compile('<h1 class="core_title_txt.*?>(.*?)</h1>',re.S)
            result=re.search(pattern,page)
    
            if result:
                #strip是删除字符串的内容,当rm为空时,默认删除空白符(包括'
    ', '
    ',  '	',  ' ')
                #group输出第一个括号的部分也就是(.*?)
    
                return result.group(1).strip()
            else:
                return None
        #获取帖子页数
        def getPageNum(self,page):
    
            pattern=re.compile('<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>',re.S)
            result=re.search(pattern,page)
    
            if result:
                return result.group(1).strip()
            else:
                return None
        #获取每一层的内容
        def getContent(self,page):
            pattern=re.compile('<div id="post_content_.*?>(.*?)</div>',re.S)
            items=re.findall(pattern,page)
    
            contents=[]
            for item in items:
                #将文本进行去除标签处理,同时在前后进行换行
                content="
    "+self.tool.replace(item)+"
    "
                contents.append(content)
            return contents
    
        #文件名设置
        def setFileTitle(self,title):
            #如果标题不为none,则取到标题
            if title is not None:
                #w+的权限是可读写,w是只能写不能读
                self.file=open(title+'.txt',"w+")
            else:
                self.file=open(self.defaultTitle+".txt","w+")
    
        #向文件写信息
        def writeData(self,contents):
            #写入每一楼的信息
            for item in contents:
                if self.floorTag == "1":
                    #楼之间加分隔符
                    floorLine="
    "+str(self.floor)+u"------------------------------------------------------
    "
                    self.file.write(floorLine)
                    self.file.write(item)
                    self.floor +=1
    
        def start(self):
            indexPage=self.getPage(1)
            pageNum=self.getPageNum(indexPage)
            title=self.getTitle(indexPage)
            self.setFileTitle(title)
    
            if pageNum == None:
                print "URL失效,请重试"
                return
    
            try:
                print "该帖子共有"+str(pageNum)+"页"
                for i in range(1,int(pageNum)+1):
                    print "正在写入第"+str(i)+"页数据"
                    page=self.getPage(i)
                    contents=self.getContent(page)
                    self.writeData(contents)
    
            # 出现写入异常
            except IOError, e:
                print "写入异常,原因" + e.message
            finally:
                print "写入任务完成"
    
    baseURL = 'http://tieba.baidu.com/p/3138733512'
    seelz = raw_input("是否只获取楼主发言,是输入1,否输入0
    ")
    floorTag = raw_input("是否写入楼层信息,是输入1,否输入0
    ")
    bdtb = BDTB(baseURL,seelz,floorTag)
    bdtb.start()
    
  • 相关阅读:
    【leetcode】7. 反转整数
    【leetcode】496. 下一个更大元素 I
    【leetcode】389. 找不同
    Linux驱动模型解析bus之platform bus
    shell 和进程
    递归调用在循环体内: 把循环展开, 这种情况是先循环再递归
    javascript函数柯里化以及柯里化带来的好处
    Maven测试篇
    关于ECharts Java类库的一个jquery插件
    javascript原型链继承
  • 原文地址:https://www.cnblogs.com/anxiaoyu/p/6558441.html
Copyright © 2011-2022 走看看