標籤:變數 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 爬蟲第二例--百度貼吧