爬虫-百度贴吧帖子

来源:互联网 发布:mac子弹头专柜价格 编辑:程序博客网 时间:2024/05/17 09:08

目的

  1. 对百度贴吧的任意帖子进行抓取
  2. 指定是否只抓取楼主发帖内容
  3. 将抓取到的内容分析并保存到文件

过程

URL格式分析

比如:http://tieba.baidu.com/p/3138733512?see_lz=1&pn=1,这是一个关于NBA50大的盘点,分析一下这个地址。

1. http://  代表资源传输使用http协议2.tieba.baidu.com 是百度的二级域名,指向百度贴吧的服务器。3. /p/3138733512 是服务器某个资源,即这个帖子的地址定位符4. see_lz和pn是该URL的两个参数,分别代表了只看楼主和帖子页码,等于1表示该条件为真

页面的抓取分析

直接上代码洛,测试通过了:

`# -*- coding: utf-8-*-__author__ = "a958832776"import urllibimport urllib2import re#处理页面标签类class Tool:     #去除img标签,7位长空格    removeImg = re.compile('<img.*?>| {7}|')    #删除超链接标签    removeAddr = re.compile('<a.*?>|</a>')    #把换行的标签换为\n    replaceLine = re.compile('<tr>|<div>|</div>|</p>')    #将表格制表<td>替换为\t    replaceTD= re.compile('<td>')    #把段落开头换为\n加空两格    replacePara = re.compile('<p.*?>')    #将换行符或双换行符替换为\n    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,"\n",x)        x = re.sub(self.replaceTD,"\t",x)        x = re.sub(self.replacePara,"\n    ",x)        x = re.sub(self.replaceBR,"\n",x)        x = re.sub(self.removeExtraTag,"",x)        #strip()将前后多余内容删除        return x.strip()#百度贴吧爬虫class baidutiebaclass:    #构造函数    def __init__(self,baseUrl,seeLZ,floorTag):        self.baseUrl=baseUrl        self.seeLZ='?see_lz='+str(seeLZ);        self.tool=Tool()        self.file=None        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 response.read();            return response.read().decode("utf-8");        except urllib2.URLError,e:            if hasattr(e,"reason"):                print u"连接百度贴吧失败,错误原因: ",e.reason                return None    def getTitle(self,page):        pattern = re.compile('<h3 class="core_title_txt.*?>(.*?)</h3>',re.S)        result = re.search(pattern,page)        if result:            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:           # print item           content="\n"+self.tool.replace(item)+"\n"           #如果出错把这个打印注释的           print content           contents.append(content.encode('utf-8'))        return contents    def setFileTitle(self,title):        #如果标题不是为None,即成功获取到标题        if title is not None:            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 = "\n" + str(self.floor) + u"-----------------------------------------------------------------------------------------\n"                self.file.write(floorLine)            self.file.write(item)            self.floor += 1    def start(self):        #从第一页代码中获取页数和标题        page=self.getPage(1)        pageNum=self.getPageNum(page)        title=self.getTitle(page)        self.setFileTitle(title);        if pageNum==None:            print u"连接失效...."            return        try:            print u"该帖子共有"+str(pageNum).decode('utf-8')+u"页"            for i in range(1,int(pageNum)+1):                print u"正在写入第"+str(i).decode('utf-8')+u"页数据"                pagecode=self.getPage(i)                contents=self.getContent(pagecode);                self.writeData(contents)        except IOError,e:            print u"写入异常,原因是: "+e.message        finally:            print u"写入任务完成"print u"请输入帖子代号"baseUrl='http://tieba.baidu.com/p/'+str(raw_input(u'http://tieba.baidu.com/p/'));seeLZ=raw_input(u'释放只获取楼主发言,是输入1,否输入0\n')floorTag=raw_input(u"是否写入楼层信息,是输入1,否输入0\n")bdtb=baidutiebaclass(baseUrl,seeLZ,floorTag)bdtb.start();`

输入任意帖子id,然后根据提示操作,不明白的地方欢迎留言交流。。。

0 0
原创粉丝点击