python 爬蟲第二例--百度貼吧

來源:互聯網
上載者:User

標籤:變數   txt   操作   異常   one   efault   nal   clear   全域   

python 第二例,爬取百度貼吧的文章,擷取文章的標題,內容,所在樓層,發布時間

其中存在一個問題,當該文章是手機端發布的文章,此時在頁面中會有標識,因此多一個span標籤,與樓層和發布時間的標籤一樣

解決方案: 目潛想到的解決方案是通過判斷爬到的值來進行選擇,但解決方案效率肯定低,因此未使用,等知識體系豐富後再進行改進

附爬取的代碼:

# -*- coding: utf-8 -*-import urllib2import urllibimport reclass Tool:    # 去除Img標籤    removeImg = re.compile(r‘<img.*?>| {0,100}|‘)    # 刪除超連結標籤    removeAddr = re.compile(r‘<a.*?>|</a>‘)    # 把換列標籤轉換為\n    replaceLine= re.compile(r‘<tr>|<div>|</div>|</p>‘)    # 把表格製表轉換為\t    replaceTD = re.compile(r‘<td>‘)    # 把段落開頭轉換為\n加兩個空格    replacePara = re.compile(‘<br><br>|<br>|<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.removeExtraTag, "", x)        # 使用strip() 方法將前後多餘內容刪除        return x.strip()class BDTB:    #初始設定變數,傳入基類地址,傳入是否只看樓主參數    def __init__(self, baseUrl, onlyLz, floorTag):        # 基地址        self.baseUrl = baseUrl        # 是否只看樓主        self.onlyLz = ‘?see_lz=‘ + str(onlyLz)        # 執行個體化替換去除標籤類        self.tool = Tool()        # 全域file變數,檔案寫入操作對象        self.file = None        # 預設標籤,若沒有獲得標題,使用此標題        self.defaultTitle = u"百度貼吧文章"        # 是否寫入樓層資訊        self.floorTag = floorTag    # 傳入頁碼,擷取該文章的代碼    def getPage(self, pageNum):        try:            url = self.baseUrl + self.onlyLz + ‘&pn=‘ + str(pageNum)            request = urllib2.Request(url)            response = urllib2.urlopen(request)            return response.read().decode(‘utf-8‘)        except urllib2.URLError,e:            if hasattr(e, ‘code‘):                print u"串連百度貼吧失敗,錯誤編碼:" + e.code                return None            if hasattr(e, ‘reason‘):                print u"串連百度貼吧失敗,錯誤原因:" + e.reason                return None    # 擷取文章的標題    def getTitle(self, page):        pattren = re.compile(r‘<h3 class="core_title_txt pull-left text-overflow  ".*?>(.*?)</h3>‘,re.S)        items = re.search(pattren, page)        if items:            # print items.group(1).strip()            return items.group(1).strip()        else:            return None    # 提取文章頁數    def getPageNum(self, page):        pattren = re.compile(r‘<ul class="l_posts_num">.*?<span class="red">(.*?)</span>‘,re.S)        items = re.search(pattren, page)        if items:            # print items.group(1)            return items.group(1).strip()        else:            return None    # 提取本文內容    def getContent(self, page):        pattren = re.compile(r‘<div id="post_content_.*?>(.*?)</div>.*?<div class="core_reply_tail clearfix">.*?<span class="tail-info">(.*?)</span>.*?<span class="tail-info">(.*?)</span>‘,re.S)        items = re.findall(pattren, page)        contents = []        for item in items:            content = []            title = "\n" + self.tool.replace(item[0]) + "\n"            floor = item[1]            writeTime = item[2]            content.append(title.encode("utf-8"))            content.append(floor.encode("utf-8"))            content.append(writeTime.encode("utf-8"))            contents.append(content)        return contents    # 設定檔案名稱字    def setFileTIltle(self, title):        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‘:                floorLineTime = "\n" + item[1] +"-----------------------------\n"+item[2]                self.file.write(floorLineTime)            self.file.write(item[0])            # floorLine = "\n" + item[‘‘]            # print "------------------%s--------------------%s-----------------"%(item[1],item[2])            # print self.tool.replace(item[0])        # print self.tool.replace(items[1])        # print items[1]    def start(self):        indexPage = self.getPage(1)        pageNum = self.getPageNum(indexPage)        title = self.getTitle(indexPage)        self.setFileTIltle(title)        if pageNum == None:            print "URL已經失效"        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 "寫入完成"print u"請輸入文章代號"baseUrl = ‘http://tieba.baidu.com/p/‘ + str(raw_input(u"http://tieba.baidu.com/p/"))seeLZ = raw_input("是否只擷取樓主的文章是輸入1,否輸入0\n")floorTag = raw_input("是否寫入樓層與時間資訊是輸入1,否輸入0\n")bdtb = BDTB(baseUrl, seeLZ, floorTag)bdtb.start()

 

python 爬蟲第二例--百度貼吧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.