python抓取百度度贴吧

作者: Lazy1 | 来源:发表于2016-10-23 17:04 被阅读1233次

    我们打开一个百度贴吧的帖子然后查看源码

    http://tieba.baidu.com/p/3138733512?see_lz=1

    Paste_Image.png

    首先我们先拿到帖子的标题,通过查看源码,我们发现,他的标题的html为:

    <h3 class="core_title_txt pull-left text-overflow  " title="纯原创我心中的NBA2014-2015赛季现役50大" style="width: 396px">纯原创我心中的NBA2014-2015赛季现役50大</h3>
    
    

    我们需要中间的标题怎么搞呢?
    肯定用正则,为了快速我们这样写:

    
    # -*- coding: UTF-8 -*- 。
    import urllib
    import urllib2
    import re
    
    
    class BDTB:
        def __init__(self, baseUrl, seeLZ):
            self.baseURL = baseUrl
            self.seeLZ = '?see_lz=' + str(seeLZ)
    
        def getPage(self, pageNum):
            try:
                url = self.baseURL + self.seeLZ + '&pn=' + str(pageNum)
                request = urllib2.Request(url)
                response = urllib2.urlopen(request)
                return response.read()
            except urllib2.URLError, e:
                if hasattr(e, "reason"):
                    print u"连接百度贴吧失败,错误原因", e.reason
                    return None
    
        def getTitle(self):
            page = self.getPage(1)
            pattern = re.compile('<h3 class="core_title_txt pull-left text-overflow.*?>(.*?)</h3>', re.S)
            result = re.search(pattern, page)
            if result:
                print result.group(1)
    
    
    baseURL = 'http://tieba.baidu.com/p/3138733512'
    bdtb = BDTB(baseURL, 1)
    bdtb.getTitle()
    
    
    

    这样我们就拿到了帖子的标题

    Paste_Image.png

    然后我们提取帖子每个楼层的内容如何去做呢?
    看源码分析呗

    <div id="post_content_53018668923" class="d_post_content j_d_post_content ">            很多媒体都在每赛季之前给球员排个名,我也有这个癖好…………,我会尽量理性的分析球队地位,个人能力等因素,评出我心目中的下赛季50大现役球员,这个50大是指预估他本赛季在篮球场上对球队的影响力……不是过去的荣誉什么的,所以难免有一定的主观性……如果把你喜欢的球星排低了,欢迎理性讨论!![](http:https://img.haomeiwen.com/i1205414/58b2b7b444eed998.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<br><br><br><br>状元维金斯镇楼<br>P.S 1 我每天都至少更新一个,不TJ。<br>      2 今年的新秀我就不考虑了,没上赛季参照</div>
    
    

    我们发现,他在一个div里面 id="post_content_53018668923" class="d_post_content j_d_post_content ",看到这我们就知道了,该怎么搞了,上代码,我们在上面的代码中增加一个获取帖子内容的方法

     def getPostData(self):
            page = self.getPage(1)
            pattern = re.compile('<div id="post_content_.*? class="d_post_content j_d_post_content ">(.*?)</div>', re.S)
            result = re.findall(pattern, page)
            for item in result:
                print item
    
    
    
    Paste_Image.png

    这样就拿到了第一页的每个楼层的数据了,我们看到有很多换行啊,什么的数据,我需要替换下

    我找了一个处理的工具类

    # -*- coding:utf-8 -*-
    import urllib
    import urllib2
    import 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()
    
    
    

    由于在同一个目录下我们直接导入

    from Tool import *

    这样导入我们就可以在别的模块的使用啦

    Paste_Image.png

    完整的代码

    
    ```java
    # -*- coding: UTF-8 -*- 。
    import urllib
    import urllib2
    import re
    from Tool import *
    
    
    class BdTb:
        def __init__(self, baseUrl, seeLZ):
            self.baseURL = baseUrl
            self.seeLZ = '?see_lz=' + str(seeLZ)
            self.tool = Tool()
    
        def getPage(self, pageNum):
            try:
                url = self.baseURL + self.seeLZ + '&pn=' + str(pageNum)
                request = urllib2.Request(url)
                response = urllib2.urlopen(request)
                return response.read()
            except urllib2.URLError, e:
                if hasattr(e, "reason"):
                    print u"连接百度贴吧失败,错误原因", e.reason
                    return None
    
        def getTitle(self):
            page = self.getPage(1)
            pattern = re.compile('<h3 class="core_title_txt pull-left text-overflow.*?>(.*?)</h3>', re.S)
            result = re.search(pattern, page)
            if result:
                print result.group(1)
    
        def getPostData(self):
            page = self.getPage(1)
            pattern = re.compile('<div id="post_content_.*? class="d_post_content j_d_post_content ">(.*?)</div>', re.S)
            result = re.findall(pattern, page)
            for item in result:
                print   self.tool.replace(item)
    
    
    baseURL = 'http://tieba.baidu.com/p/3138733512'
    BdTb = BdTb(baseURL, 1)
    BdTb.getPostData()
    
    
    
    

    相关文章

      网友评论

      • 黑夜no烟丝:转载注明出处
      • Harvest:怎么添图片啊
      • Harvest:为什么我抓不到后面的东西额了
        Harvest:你好 我想问 怎么看是异步的网页啊 不然都不知道怎么抓
        Lazy1:@泣你别离 是不是更新,如果更新了就需要重新写正则

      本文标题:python抓取百度度贴吧

      本文链接:https://www.haomeiwen.com/subject/nlrkuttx.html