天天看點

爬蟲-糗事百科段子

練習爬取糗事百科段子,直接上代碼洛,有注釋哦。。。

__author__="a958832776"
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import thread
import  time

class qiushibaikeclass:

    #初始化方法,定義一些變量
    def __init__(self):
        self.pageIndex=
        self.user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        #初始化headers
        self.headers= { 'User-Agent' : self.user_agent }
        #存放段子的變量,每一個元素是每一頁的段子們
        self.stories=[]
        #程式是否繼續
        self.enable=False
    #傳入某一頁的索引獲得頁面代碼
    def getPage(self,pageIndex):
        try:
            url='http://www.qiushibaike.com/' + str(pageIndex)
            #建構請求request
            request=urllib2.Request(url,headers=self.headers)
            #利用urlopen擷取頁面代碼
            response=urllib2.urlopen(request)
            #将頁面代碼轉換成utf-8編碼
            pageCode=response.read().decode('utf-8')
            return pageCode
        except urllib2.URLError,e:
            if hasattr(e,"reason"):
                print u"連接配接糗事百科失敗,錯誤原因:"+e.reason
                return None
    #傳入某一頁代碼,傳回本頁不帶圖檔的段子清單
    def getPageItems(self,pageIndex):
        pageCode=self.getPage(pageIndex)
        if not pageCode:
            print "頁面加載失敗"
            return None
        #pattern= re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class'+
        #             '="content".*?title="(.*?)">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
        pattern=re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div class="content">(.*?)</div>.*?<div class="stats".*?i class="number">(.*?)</i>(.*?)</span>.*?<span class="dash".*?i class="number">(.*?)</i>(.*?)</a>',re.S)

        items = re.findall(pattern,pageCode)
        #用來存儲每頁的段子們
        pageStories = []
        #周遊正規表達式比對的資訊
        for item in items:
            #haveImg = re.search("img",item[3])
            #if not haveImg:
                 #item[0]是一個段子的釋出者,item[1]是釋出時間,item[2]是内容,item[4]是點贊數
                pageStories.append([item[].strip(),item[].strip(),item[].strip(),item[].strip()])
        return pageStories

    #加載并提取頁面的内容,加入到清單中
    def loadPage(self):
        #如果目前未看的頁數少于2頁,則加載新一頁
        if self.enable == True:
            if len(self.stories) < :
                #擷取新一頁
                pageStories = self.getPageItems(self.pageIndex)
                #将該頁的段子存放到全局list中
                if pageStories:
                    self.stories.append(pageStories)
                    #擷取完之後頁碼索引加一,表示下次讀取下一頁
                    self.pageIndex += 

      #每次回車列印輸出一個段子
    def printOneStory(self,pageStories,page):
        #周遊一頁的段子
        for story in pageStories:
            #等待使用者輸入
            input = raw_input()
            self.loadPage();
            #如果輸入Q則結束
            if input=="Q":
                self.enable=False
                return
            print u"%d%s%s%s%s\n" %(page,story[],story[],story[],story[])
    #開始方法
    def start(self):
        print u"enter contiune  q exit"
          #使變量為True,程式可以正常運作
        self.enable = True
        #先加載一頁内容
        self.loadPage()
        #局部變量,控制目前讀到了第幾頁
        nowPage = 
        while self.enable:
            if len(self.stories)>:
                #從全局list中擷取一頁的段子
                pageStories = self.stories[]
                #目前讀到的頁數加一
                nowPage += 
                #将全局list中第一個元素删除,因為已經取出
                del self.stories[]
                #輸出該頁的段子
                self.printOneStory(pageStories,nowPage)

#執行個體化類   
spider=qiushibaikeclass()
#開始抓取
spider.start()

           

代碼中的正規表達式和輸出可以任意更換成自己想要的格式,不明白的地方歡迎留言交流。