python 爬蟲第一例--糗事百科python
以前一直在學習python的基礎內容,都在文章中,待整理好後發到隨筆,糗事百科是爬蟲第一例,參照網上例子,對正則進行更改,主要是理解其思路app
# -*- coding: utf-8 -*- # 糗事百科爬蟲 import urllib import urllib2 import re class QSBK: # 初始化方法,定義變量 def __init__(self): self.pageIndex = 1 self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0' self.header = { 'User-Agent' : self.user_agent } self.url = 'http://www.qiushibaike.com/hot/page/' # 存放段子變量,每一頁單獨存儲 self.stories = [] # 存放程序是否繼續運行的變量 self.enable = False # 傳入某一頁的索引得到的頁碼 def getPage(self, pageIndex): try: open_url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex) #構建請求的request request = urllib2.Request(open_url, headers = self.header) response = urllib2.urlopen(request) content = response.read().decode('utf-8') return content 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 getPageItem(self, pageIndex): pageCode = self.getPage(pageIndex) if not pageCode: print u"頁面加載失敗" return None pattren = re.compile(r'<div class="author clearfix">.*?<h2>(.*?)</h2>(.*?)<div class="single-clear">',re.S) items = re.findall(pattren, pageCode) #用來存儲每頁的段子們 pageStories = [] for item in items: haveImg = re.search("thumb", item[1]) if not haveImg: # print item[0] pattren1 = re.compile(r'<div class="content">.*?<span>(.*?)</span>.*?<div class="stats">.*?<i class="number">(.*?)</i>',re.S) sec_strs = re.findall(pattren1, item[1]) for sec_str in sec_strs: # 將sec_str[0] 中的br轉換爲\n replaceBR = re.compile('<br/>') text = re.sub(replaceBR, "\n", sec_str[0]) pageStories.append([item[0].strip(), text.strip(), sec_str[1].strip()]) return pageStories # 加載並提取頁面的內容,加入到列表 def loadPage(self): if self.enable == True: if len(self.stories) < 1: # 獲取新的一頁 pageStories = self.getPageItem(self.pageIndex) # 將該頁的段子存放到全局list中 if pageStories: self.stories.append(pageStories) self.pageIndex += 1 # 調用該方法,每次敲一個回車打印出一個段子 def getOneStory(self, pageStories, page): # 遍歷一頁的段子 for story in pageStories: # 等待用戶輸入 input = raw_input() # 每輸入一次回車,判斷一下是否須要加載新的頁面 self.loadPage() # 若是輸入Q表示結束程序 if input == 'Q': self.enable = False return print u"第%d頁\t發佈人:%s\t贊:%s\n%s" %(page,story[0],story[2],story[1]) # 開始方法 def start(self): print u"您正在讀糗事百科,按回車查看段子,按Q退出" #使遍歷變爲True 程序能夠正常運行 self.enable = True self.loadPage() # 局部變量,控制當前讀到第幾頁 nowPage = 0 while self.enable: if len(self.stories) >0: # 從全局list中讀取一頁段子 pageStories = self.stories[0] # 當前讀到的頁數增長一 nowPage +=1 # 將全局list中第一個元素刪除,由於已經取出 del self.stories[0] #輸出該頁的段子 self.getOneStory(pageStories, nowPage) spider = QSBK() spider.start()
生成的實例ide