標籤:多線程 豆瓣 編程 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都可運行)