1. 程式人生 > 程式設計 >python爬蟲中多執行緒的使用詳解

python爬蟲中多執行緒的使用詳解

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爬蟲中多執行緒的使用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!