亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

零基礎(chǔ)寫(xiě)python爬蟲(chóng)之抓取糗事百科代碼分享

 更新時(shí)間:2014年11月06日 10:01:25   投稿:hebedich  
前面我們介紹了如何抓取百度貼吧文章,然后講解了python的神器正則表達(dá)式,下面,我們就把2者結(jié)合起來(lái),詳細(xì)介紹下,如何來(lái)抓取到糗事百科里面的指定內(nèi)容

項(xiàng)目?jī)?nèi)容:

用Python寫(xiě)的糗事百科的網(wǎng)絡(luò)爬蟲(chóng)。

使用方法:

新建一個(gè)Bug.py文件,然后將代碼復(fù)制到里面后,雙擊運(yùn)行。

程序功能:

在命令提示行中瀏覽糗事百科。

原理解釋?zhuān)?br />

首先,先瀏覽一下糗事百科的主頁(yè):http://www.qiushibaike.com/hot/page/1
可以看出來(lái),鏈接中page/后面的數(shù)字就是對(duì)應(yīng)的頁(yè)碼,記住這一點(diǎn)為以后的編寫(xiě)做準(zhǔn)備。
然后,右擊查看頁(yè)面源碼:

觀察發(fā)現(xiàn),每一個(gè)段子都用div標(biāo)記,其中class必為content,title是發(fā)帖時(shí)間,我們只需要用正則表達(dá)式將其“扣”出來(lái)就可以了。
明白了原理之后,剩下的就是正則表達(dá)式的內(nèi)容了,可以參照這篇文章:
http://chabaoo.cn/article/57150.htm

運(yùn)行效果:


復(fù)制代碼 代碼如下:

# -*- coding: utf-8 -*-   
    
import urllib2   
import urllib   
import re   
import thread   
import time     
#----------- 加載處理糗事百科 -----------   
class Spider_Model:   
       
    def __init__(self):   
        self.page = 1   
        self.pages = []   
        self.enable = False   
   
    # 將所有的段子都扣出來(lái),添加到列表中并且返回列表   
    def GetPage(self,page):   
        myUrl = "         user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
        headers = { 'User-Agent' : user_agent }  
        req = urllib2.Request(myUrl, headers = headers)  
        myResponse = urllib2.urlopen(req) 
        myPage = myResponse.read()   
        #encode的作用是將unicode編碼轉(zhuǎn)換成其他編碼的字符串   
        #decode的作用是將其他編碼的字符串轉(zhuǎn)換成unicode編碼   
        unicodePage = myPage.decode("utf-8")   
   
        # 找出所有class="content"的div標(biāo)記   
        #re.S是任意匹配模式,也就是.可以匹配換行符   
        myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)   
        items = []   
        for item in myItems:   
            # item 中第一個(gè)是div的標(biāo)題,也就是時(shí)間   
            # item 中第二個(gè)是div的內(nèi)容,也就是內(nèi)容   
            items.append([item[0].replace("\n",""),item[1].replace("\n","")])   
        return items   
   
    # 用于加載新的段子   
    def LoadPage(self):   
        # 如果用戶(hù)未輸入quit則一直運(yùn)行   
        while self.enable:   
            # 如果pages數(shù)組中的內(nèi)容小于2個(gè)   
            if len(self.pages) < 2:   
                try:   
                    # 獲取新的頁(yè)面中的段子們   
                    myPage = self.GetPage(str(self.page))   
                    self.page += 1   
                    self.pages.append(myPage)   
                except:   
                    print '無(wú)法鏈接糗事百科!'   
            else:   
                time.sleep(1)   
           
    def ShowPage(self,nowPage,page):   
        for items in nowPage:   
            print u'第%d頁(yè)' % page , items[0]  , items[1]   
            myInput = raw_input()   
            if myInput == "quit":   
                self.enable = False   
                break   
           
    def Start(self):   
        self.enable = True   
        page = self.page   
   
        print u'正在加載中請(qǐng)稍候......'   
           
        # 新建一個(gè)線程在后臺(tái)加載段子并存儲(chǔ)   
        thread.start_new_thread(self.LoadPage,())   
           
        #----------- 加載處理糗事百科 -----------   
        while self.enable:   
            # 如果self的page數(shù)組中存有元素   
            if self.pages:   
                nowPage = self.pages[0]   
                del self.pages[0]   
                self.ShowPage(nowPage,page)   
                page += 1   
    
#----------- 程序的入口處 -----------   
print u""" 
--------------------------------------- 
   程序:糗百爬蟲(chóng) 
   版本:0.3 
   作者:why 
   日期:2014-06-03 
   語(yǔ)言:Python 2.7 
   操作:輸入quit退出閱讀糗事百科 
   功能:按下回車(chē)依次瀏覽今日的糗百熱點(diǎn) 
--------------------------------------- 
""" 
print u'請(qǐng)按下回車(chē)瀏覽今日的糗百內(nèi)容:'   
raw_input(' ')   
myModel = Spider_Model()   
myModel.Start()   

Q&A:
1.為什么有段時(shí)間顯示糗事百科不可用?
答:前段時(shí)間因?yàn)轸苁掳倏铺砑恿薍eader的檢驗(yàn),導(dǎo)致無(wú)法爬取,需要在代碼中模擬Header?,F(xiàn)在代碼已經(jīng)作了修改,可以正常使用。

2.為什么需要單獨(dú)新建個(gè)線程?
答:基本流程是這樣的:爬蟲(chóng)在后臺(tái)新起一個(gè)線程,一直爬取兩頁(yè)的糗事百科,如果剩余不足兩頁(yè),則再爬一頁(yè)。用戶(hù)按下回車(chē)只是從庫(kù)存中獲取最新的內(nèi)容,而不是上網(wǎng)獲取,所以瀏覽更順暢。也可以把加載放在主線程,不過(guò)這樣會(huì)導(dǎo)致爬取過(guò)程中等待時(shí)間過(guò)長(zhǎng)的問(wèn)題。

相關(guān)文章

最新評(píng)論