Python爬蟲——抓取糗百段子

在別人博客裏學習的 抓取糗百段子,因爲糗百不斷的更新,代碼須要改正。html

抓取網頁:http://www.qiushibaike.com/hot/page/1正則表達式

修改後的代碼以下:app

# -*- coding:utf-8 -*-

import urllib
import urllib2
import re
import thread
import time

#糗事百科爬蟲類
class QSBK:

    #初始化方法,定義一些變量
    def __init__(self):
        self.pageIndex = 1
        #user_agent 從火狐 HttpFox中headers查找到
        #self.user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0)'
        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/hot/page/' + 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 clearfix">.*?href.*?<img src.*?title=.*?<h2>(.*?)</h2>.*?<div class="content">(.*?)</div>.*?<i class="number">(.*?)</i>',re.S)
        items = re.findall(pattern,pageCode)
        #print len(items)
        #print "*****items"
        #用來存儲每頁的段子們
        pageStories = []
        #遍歷正則表達式匹配的信息
        i = 0
        for item in items:
            #若是不含有圖片,把它加入list中
            #if not haveImg:
                replaceBR = re.compile('<.?span>')
                #將<br/> 用 換行符\n 替換
                text = re.sub(replaceBR,"\n",item[1])
                #item[0]是一個段子的發佈者,item[1]是內容,item[2]是發佈時間,item[4]是點贊數
                pageStories.append([item[0],text,item[2]])

                #strip()做用:去掉轉義字符後輸出
        #print item[0] +"-------0t"
        #print item[1] +"-------0T"
        #print text + "******TEXT"
        #print item[2] +"-------0t"
       
        return pageStories

    #加載並提取頁面的內容,加入到列表中
    def loadPage(self):
        #若是當前未看的頁數少於2頁,則加載新一頁
        if self.enable == True:
            if len(self.stories) < 2:
                #獲取新一頁
                pageStories = self.getPageItems(self.pageIndex)
                #將該頁的段子存放到全局list中
                if pageStories:
                    self.stories.append(pageStories)
                    #獲取完以後頁碼索引加一,表示下次讀取下一頁
                    self.pageIndex += 1

                print len(self.stories)
    #調用該方法,每次敲回車打印輸出一個段子
    def getOneStory(self,pageStories,page):
        #遍歷一頁的段子

        for story in pageStories:
            #等待用戶輸入
            input = raw_input()
            #每當輸入回車一次,判斷一下是否要加載新頁面
            self.loadPage()
            #若是輸入Q則程序結束
            if input == "Q":
                self.enable = False
                return
            #print "$$$"
            print len(story)
            #如今網頁已沒有發佈時間了
            #print u"第%d頁\t發佈人:%s\t發佈時間:%s\t贊:%s\n%s" %(page,story[0],story[2],story[3],story[1])
            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:
                #print len(self.stories)
                #print "-------stories"
                #從全局list中獲取一頁的段子
                pageStories = self.stories[0]
                #當前讀到的頁數加一
                nowPage += 1
                #將全局list中第一個元素刪除,由於已經取出
                del self.stories[0]
                #print "---------------------------------"
                #print len(pageStories)
                #print nowPage
                #輸出該頁的段子
                self.getOneStory(pageStories,nowPage)


spider = QSBK()
spider.start()
相關文章
相關標籤/搜索