国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2019-11-25 18:06:59
字體:
供稿:網(wǎng)友

項(xiàng)目內(nèi)容:

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

使用方法:

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

程序功能:

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

原理解釋:

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

觀察發(fā)現(xiàn),每一個段子都用div標(biāo)記,其中class必為content,title是發(fā)帖時(shí)間,我們只需要用正則表達(dá)式將其“扣”出來就可以了。
明白了原理之后,剩下的就是正則表達(dá)式的內(nèi)容了,可以參照這篇文章:
//m.survivalescaperooms.com/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   
   
    # 將所有的段子都扣出來,添加到列表中并且返回列表   
    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 中第一個是div的標(biāo)題,也就是時(shí)間   
            # item 中第二個是div的內(nèi)容,也就是內(nèi)容   
            items.append([item[0].replace("/n",""),item[1].replace("/n","")])   
        return items   
   
    # 用于加載新的段子   
    def LoadPage(self):   
        # 如果用戶未輸入quit則一直運(yùn)行   
        while self.enable:   
            # 如果pages數(shù)組中的內(nèi)容小于2個   
            if len(self.pages) < 2:   
                try:   
                    # 獲取新的頁面中的段子們   
                    myPage = self.GetPage(str(self.page))   
                    self.page += 1   
                    self.pages.append(myPage)   
                except:   
                    print '無法鏈接糗事百科!'   
            else:   
                time.sleep(1)   
           
    def ShowPage(self,nowPage,page):   
        for items in nowPage:   
            print u'第%d頁' % 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'正在加載中請稍候......'   
           
        # 新建一個線程在后臺加載段子并存儲   
        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""" 
--------------------------------------- 
   程序:糗百爬蟲 
   版本:0.3 
   作者:why 
   日期:2014-06-03 
   語言:Python 2.7 
   操作:輸入quit退出閱讀糗事百科 
   功能:按下回車依次瀏覽今日的糗百熱點(diǎn) 
--------------------------------------- 
""" 
print u'請按下回車瀏覽今日的糗百內(nèi)容:'   
raw_input(' ')   
myModel = Spider_Model()   
myModel.Start()   

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永泰县| 九江市| 高邮市| 揭西县| 沂源县| 山东省| 双桥区| 贵德县| 金堂县| 霸州市| 略阳县| 大理市| 余干县| 汤原县| 乌兰浩特市| 静乐县| 台湾省| 遂平县| 武夷山市| 玛多县| 山阴县| 清丰县| 灵山县| 连平县| 潞城市| 建平县| 长阳| 依兰县| 隆尧县| 洛浦县| 永州市| 中山市| 台安县| 湟源县| 平阴县| 汉寿县| 新龙县| 渭源县| 临洮县| 噶尔县| 凌云县|