超簡單,帶你學會多執行緒爬蟲

  • 2019 年 11 月 11 日
  • 筆記

作者:Tango 編輯:王老濕

今天我們來介紹了一些爬蟲的技術,實現基本的抓取需求。但是隨著數據量變大時,我們之前的爬蟲的效率或者說執行速度就會出現問題,之前我們都是一條數據爬取完成後才繼續下一條數據的爬取,這種模式我們通常稱它為單執行緒或者串列爬蟲。那麼該如何改善呢?通過本章的學習你將掌握以下內容:

  • 多執行緒:了解多執行緒的基本概念
  • 多進程:了解多進程的概念
  • 性能對比:通過一個爬蟲案例對比它們之間的性能
  • 多進程的使用

多執行緒與多進程

1. 多執行緒和多進程概述

當電腦運行程式時,就會創建包含程式碼和狀態的進程。這些進程會通過電腦的一個或多個CPU執行。不過,同一時刻每個CPU只會執行一個進程,然後不同進程間快速切換,給我們一種錯覺,感覺好像多個程式在同時進行。

一個進程中,程式的執行也是在不同的執行緒間進行切換,每個執行緒執行程式的不同部分。

例如:有一個大型工廠,該工廠負責生產電腦,工廠有很多的車間用來生產不同的電腦部件。每個車間又有很多工人互相合作共享資源來生產某個電腦部件。這裡的工廠相當於一個爬蟲工程,每個車間相當於一個進程,每個工人就相當於執行緒。

2. 多進程的使用方法

我們這裡為大家介紹的是Python中的multiprocessing庫,使用方法如下:

import re    from multiprocessing import Pool  pool = Pool(processes = 4) # 這個4代表著進程數  pool.map(func, iterable) # func 為方法名, iterable為可迭代的參數

3. 性能對比

我們這裡以糗事百科的用戶名稱為例,分別對單進程,2進程,4進程的性能進行對比,程式碼如下:

import requests  import re  import time  from multiprocessing import Pool      headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)       AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}    def spyder(url):      '''      解析頁面      '''      res = requests.get(url, headers = headers)      ids = re.findall('<h2>(.*?)</h2>', res.text, re.S) # 獲取用戶名      time.sleep(1)    if __name__ == "__main__":      urls = ["https://www.qiushibaike.com/text/page/{}/".format(str(i)) for i in range(1, 10)]      start_1 = time.time()      for url in urls:          spyder(url)      end_1 = time.time()      print("單進程:",end_1 - start_1)        start_2 = time.time()      pool = Pool(processes = 2)      pool.map(spyder, urls)      end_2 = time.time()      print("2進程:",end_2 - start_2)        start_3 = time.time()      pool = Pool(processes = 4)      pool.map(spyder, urls)      end_3 = time.time()      print("2進程:",end_3 - start_3)

運行結果:

這裡只是獲取了用戶名的資訊,大家可以將其他資訊也爬取出來看看,動手試試看看能縮少多少時間。好了這周的內容就這麼多,雖然內容不是很多,但卻很重要,大家要多多練習。