多線程抓取豆瓣編程書籍(linux\windows都可運行)

來源:互聯網
上載者:User

標籤:多線程   豆瓣   編程   Regex   python   

首先建立兩個隊列,queue佇列儲存體要爬的網址,out_queue儲存的是要取內容的網頁原始碼。

建立線程類,ThreadUrl的作用是從給定的網址上抓取網頁內容,並將內容儲存在out_queue隊列上,而DatamineThread的作用是從網頁原始碼中通過正則來取想要的內容。

這個代碼在window下啟動並執行話就需要將.decode(‘utf8‘)那句話前面的#刪除就ok了,編碼方式需要改一下。

如果想自己編寫的話,使用queue的時候一定不要忘了調用task_done()函數,不然程式將一直運行。

使用Regex的時候抓取內容的格式一定要注意,要與原始碼中一致,開始的時候我少了幾個空格斷行符號,各種抓不到啊。

已耗用時間更電腦配置有關,可能會較長,可以通過調整抓取網頁的數量來控制時間。


#-*- coding:utf-8 -*-import Queueimport threadingimport urllib2import timeimport refrom BeautifulSoup import BeautifulSoup host = 'http://www.douban.com/tag/%E7%BC%96%E7%A8%8B/book?start='queue = Queue.Queue() out_queue = Queue.Queue()class ThreadUrl(threading.Thread):    def __init__(self,queue,out_queue):        threading.Thread.__init__(self)        self.queue = queue        self.out_queue = out_queue    def run(self):        while True:            host = self.queue.get()            url = urllib2.urlopen(host)            chunk = url.read()            self.out_queue.put(chunk)            self.queue.task_done()class DatamineThread(threading.Thread):    def __init__(self,out_queue):        threading.Thread.__init__(self)        self.out_queue = out_queue    def run(self):        while True:            chunk = self.out_queue.get()            title = re.findall('''class="title" target="_blank">(.*?)</a>''',chunk)            apprise = re.findall('''<span class="rating_nums">(.*?)</span>''',chunk)            desc = re.findall('''<div class="desc">        (.*?)      </div>''',chunk)            #print desc[14]            for i in range(14):                print ('書名:'+title[i]+'\n評價:'+apprise[i]+'\n描述:'+desc[i]+'\n')#.decode('utf8')            self.out_queue.task_done()start = time.time()def main():    for i in range(5):        t = ThreadUrl(queue,out_queue)        t.setDaemon(True)        t.start()    for BookNum in range(10):        queue.put(host+str(BookNum*15))    for i in range(5):        dt = DatamineThread(out_queue)        dt.setDaemon(True)        dt.start()    queue.join()    out_queue.join()#print '++++++++++++++++++++++++++++++++JD_SPIDER+++++++++++++++++++++++++++++++++++++'main()print "Total time :%s"%(time.time()-start)#print '++++++++++++++++++++++++++++++++JD_SPIDER+++++++++++++++++++++++++++++++++++++'                        




多線程抓取豆瓣編程書籍(linux\windows都可運行)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.