python爬蟲中多執行緒的使用詳解
阿新 • • 發佈:2020-01-09
queue介紹
queue是python的標準庫,俗稱佇列.可以直接import引用,在python2.x中,模組名為Queue。python3直接queue即可
在python中,多個執行緒之間的資料是共享的,多個執行緒進行資料交換的時候,不能夠保證資料的安全性和一致性,所以當多個執行緒需要進行資料交換的時候,佇列就出現了,佇列可以完美解決執行緒間的資料交換,保證執行緒間資料的安全性和一致性。
#多執行緒實戰慄子(糗百) #用一個佇列Queue物件, #先產生所有url,put進佇列; #開啟多執行緒,把queue佇列作為引數傳入 #主函式中讀取url import requests from queue import Queue import re,os,threading,time # 構造所有ip地址並新增進queue佇列 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/65.0.3325.181 Safari/537.36' } urlQueue = Queue() [urlQueue.put('http://www.qiumeimei.com/image/page/{}'.format(i)) for i in range(1,14)] def get_image(urlQueue): while True: try: # 不阻塞的讀取佇列資料 url = urlQueue.get_nowait() # i = urlQueue.qsize() except Exception as e: break print('Current Thread Name %s,Url: %s ' % (threading.currentThread().name,url)) try: res = requests.get(url,headers=headers) url_infos = re.findall('data-lazy-src="(.*?)"',res.text,re.S) for url_info in url_infos: if os.path.exists(img_path + url_info[-20:]): print('圖片已存在') else: image = requests.get(url_info,headers=headers) with open(img_path + url_info[-20:],'wb') as fp: time.sleep(1) fp.write(image.content) print('正在下載:' + url_info) except Exception as e: print(e) if __name__ == '__main__': startTime = time.time() # 定義圖片儲存路徑 img_path = './img/' if not os.path.exists(img_path): os.mkdir(img_path) threads = [] # 可以調節執行緒數, 進而控制抓取速度 threadNum = 4 for i in range(0,threadNum): t = threading.Thread(target=get_image,args=(urlQueue,)) threads.append(t) for t in threads: t.start() for t in threads: # 多執行緒多join的情況下,依次執行各執行緒的join方法,這樣可以確保主執行緒最後退出, 且各個執行緒間沒有阻塞 t.join() endTime = time.time() print('Done,Time cost: %s ' % (endTime - startTime))
總結
以上所述是小編給大家介紹的python爬蟲中多執行緒的使用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!