超簡單,帶你學會多執行緒爬蟲
- 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)
運行結果:

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