標籤:python 網路爬蟲 多線程 架構 同步隊列
程式大概內容如下:
程式中設定兩個隊列分別為queue負責存放網址,out_queue負責存放網頁的原始碼。
ThreadUrl線程負責將隊列queue中網址的原始碼urlopen,存放到out_queue隊列中。
DatamineThread線程負責使用BeautifulSoup模組從out_queue網頁的原始碼中提取出想要的內容並輸出。
這隻是一個基本的架構,可以根據需求繼續擴充。
程式中有很詳細的注釋,如有有問題跪求指正啊。
import Queueimport threadingimport urllib2import timefrom BeautifulSoup import BeautifulSouphosts = ["http://yahoo.com","http://taobao.com","http://apple.com", "http://ibm.com","http://www.amazon.cn"]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)#將hosts中的頁面傳給out_queue 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() soup = BeautifulSoup(chunk)#從原始碼中搜尋title標籤的內容 print soup.findAll(['title']) self.out_queue.task_done()start = time.time()def main(): for i in range(5): t = ThreadUrl(queue,out_queue)#線程任務就是將網址的原始碼存放到out_queue隊列中 t.setDaemon(True)#設定為守護線程 t.start() #將網址都存放到queue隊列中 for host in hosts: queue.put(host) for i in range(5): dt = DatamineThread(out_queue)#線程任務就是從原始碼中解析出<title>標籤內的內容 dt.setDaemon(True) dt.start() queue.join()#線程依次執行,主線程最後執行 out_queue.join()main()print "Total time :%s"%(time.time()-start)
python多線程多隊列(BeautifulSoup網路爬蟲)