【python】抄写大神的百度贴吧代码
生活随笔
收集整理的這篇文章主要介紹了
【python】抄写大神的百度贴吧代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文鏈接:http://cuiqingcai.com/993.html
?
劃重點:
1.提取帖子內容時,對圖片,貼吧自動增加的超鏈接,制表符,換行符要做刪除或替換處理
2.decode是把bytes轉換為str, encode是把str轉換為bytes ?原帖中的代碼第100行多了一個encode,導致出錯
3.代碼中用到了文件相關操作
4.原文中獲取標題的正則表達式我覺得不太對,做了修改。原文只是提取了<h1></h1>直接的,但實際上有在<h3></h3>直接的
?
最終代碼如下,在python3.4.3中實現
import urllib.request import urllib.parse import re#處理頁面標簽類 class Tool:#去除img標簽,7位長空格removeImg = re.compile('<img.*?>| {7}')#刪除超鏈接標簽removeAddr = re.compile('<a.*?>|</a>')#把換行的標簽換為\nreplaceLine = re.compile('<tr>|<div>|</div>|</p>')#將表格制表<td>替換為\treplaceTD = re.compile('<td>')#把段落開頭換為\n加空兩格replacePara = re.compile('<p.*?>')#將換行符或雙換行符替換為\nreplaceBR = 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)return x.strip()#百度貼吧爬蟲類 class BDTB:#初始化,傳入基地址,是否只看樓主的參數def __init__(self, baseUrl, seeLZ,floorTag):self.baseURL = baseUrlself.seeLZ = '?see_lz='+str(seeLZ)self.tool = Tool()self.file = Noneself.floor = 1self.defaultTitle = u"百度貼吧"self.floorTag = floorTag#傳入頁碼,獲取該頁帖子的代碼def getPage(self, pageNum):try:url = self.baseURL+self.seeLZ+'&pn='+str(pageNum)request = urllib.request.Request(url)response = urllib.request.urlopen(request)return response.read().decode('utf-8','ignore') #注意轉換成字符串except urllib.error.URLError as e:if hasattr(e, "reason"):print(u"連接百度貼吧失敗,錯誤原因:", e.reason)return None#獲取帖子標題def getTitle(self):pageCode = self.getPage(1)pattern = re.compile('''<h\d class="core_title_txt.*?title="(.*?)" style="width:.*?</h\d>''', re.S)result = re.search(pattern, pageCode)if result:title = result.group(1).strip() #這里注意,獲取分組的方法return titleelse:return None#提取帖子頁數def getPageNum(self):pageCode = self.getPage(1)pattern = re.compile('''<span class=.*?</span>.*?回復貼,共.*?<span class=.*?>(.*?)</span>''', re.S)result = re.search(pattern, pageCode)if result:pageNum = result.group(1).strip()return pageNumelse: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 = "\n"+self.tool.replace(item)+"\n"contents.append(content)return contentsdef setFileTitle(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':#樓之間的分隔符floorLine = "\n" + str(self.floor) + "樓-------------------------------------"self.file.write(floorLine)self.file.write(item)self.floor+=1def start(self):pageNum = self.getPageNum()title = self.getTitle()self.setFileTitle(title)if pageNum == None:print(u"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 as e:print("寫入異常,原因"+e.message)finally:print("寫入任務完成")print(u"請輸入帖子代號") baseURL = 'http://tieba.baidu.com/p/' + str(input(u'http://tieba.baidu.com/p/')) seeLZ = input("是否只看樓主發言,是輸入1,否輸入0\n") floorTag = input("是否寫入樓層信息,是輸入1,否輸入0\n") bdtb = BDTB(baseURL, seeLZ, floorTag) bdtb.start()?
總結
以上是生活随笔為你收集整理的【python】抄写大神的百度贴吧代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读取数量不定的输入数据
- 下一篇: 浅谈python中的一般方法、静态方法(