標籤:python 爬蟲
剛剛測試了糗百爬蟲,結果第二天糗百的原始碼就換格式了= =
改了下Regex,但是內容中存在的html轉碼還未匹配,不影響使用
#! -*- coding:utf-8 -*-#! usr/bin/python‘‘‘#=====================================================# FileName: Spider_qb.py# Describe: 從糗百下載段子並依次播放# Modifier: sunny# Since: 2015-04-20# 變數說明:items,self.pages為list,形式為:# [ [‘時間‘,‘段子內容‘,‘時間‘,‘段子內容‘,...]#一行為一頁內容# ......# [‘時間‘,‘段子內容‘,‘時間‘,‘段子內容‘,...] ]#=====================================================‘‘‘import urllib2import re,chardetimport thread,timeclass QiubaiSpider(object): """糗事百科爬蟲""" def __init__(self): #page為要顯示的頁碼 #pages儲存多頁內容 self.page = 1 self.pages = [] self.enable = False #下載1頁內容 def GetPage(self,page): myUrl = "http://m.qiushibaike.com/hot/page/" + str(page) user_agent = ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘ headers = {‘User-Agent‘ : user_agent } req = urllib2.Request(myUrl,headers = headers) myPage = urllib2.urlopen(req).read() #添加編解碼代碼 #...... unicodePage = myPage.decode("utf-8") #利用Regex匹配糗百內容, pattern包含兩個group #前兩個元字元匹配空格等,不是group #.*匹配任意多個字元, ?將其變為非貪婪模式 #re.DOTALL匹配包括‘\n‘的任意內容 #新的糗百匹配正則 #content = re.compile(r‘<div.*?class="content">(.*?)<!--([\s\S]{19})-->(.*)</div>‘,re.DOTALL) content = re.findall(r‘<div.*?class="content">(.*?)<!--([\s\S]{19})(.*?)</div>‘,unicodePage,re.DOTALL) items = [] #content中pattern匹配的第1個group是title後的時間 #第2個group匹配<div>和</div>之間的內容,即段子內容 for item in content: #將內容中的分行符號替換 items.append([ item[0].replace("\n",""),item[1].replace("<br/>","") ]) return items #緩衝多頁內容,使用者未輸入quit就一直運行 def LoadPage(self): while self.enable: #當前緩衝的內容小於2頁就開始載入 if len(self.pages) < 2: try: tempPage = self.GetPage(self.page) self.page += 1 self.pages.append(tempPage) except: print ‘無法串連糗百!‘ break else: #緩衝充足等待1秒 time.sleep(1) def ShowPage(self,nowPage,page): for items in nowPage: print u‘第%d頁‘ % page , items[1] print items[0] myInput = raw_input() if myInput != "": self.enable = False break def Start(self): self.enable = True #建立線程前把頁碼讀出來,否則線程讀取後頁碼值就改變了 page = self.page #後台開新線程緩衝糗百內容 #參數1為線程函數,參數2為傳遞給線程函數的參數此處為空白tuple thread.start_new_thread(self.LoadPage,()) while self.enable: #緩衝區有內容 if self.pages: #每次取出緩衝區最前面一頁內容來顯示 #取出後刪除緩衝區對應內容 tempNowPage = self.pages[0] del self.pages[0] self.ShowPage(tempNowPage,page) page += 1#----------- 程式的入口處 -----------print u"""#=====================================================# FileName: Spider_qb.py# Describe: 從糗百下載段子並依次播放# Modifier: sunny# Since: 2015-04-20# 變數說明:items,self.pages為list,形式為:# [ [‘時間‘,‘段子內容‘,‘時間‘,‘段子內容‘,...]#一行為一頁內容# ......# [‘時間‘,‘段子內容‘,‘時間‘,‘段子內容‘,...] ]#=====================================================--------------------------------------- 程式:糗百爬蟲 版本:0.2 參考:why 語言:Python 2.7 修改: 江前雲後 操作:斷行符號閱讀,非斷行符號退出---------------------------------------"""print u‘斷行符號鍵瀏覽糗百熱點(任意鍵退出):‘raw_input(‘ ‘)qb = QiubaiSpider()qb.Start()
[python]糗百熱點爬蟲v2.0【15/4/21更新】