超简单,带你学会多线程爬虫
作者:Tango,目前就職在一家對日開發(fā)的的IT服務(wù)公司。不是科班出身的我,出于對編程的熱愛,自學了軟件開發(fā)。從此深深陷入在代碼的世界而無法自拔。
編輯:王老濕
今天我們來介紹了一些爬蟲的技術(shù),實現(xiàn)基本的抓取需求。但是隨著數(shù)據(jù)量變大時,我們之前的爬蟲的效率或者說執(zhí)行速度就會出現(xiàn)問題,之前我們都是一條數(shù)據(jù)爬取完成后才繼續(xù)下一條數(shù)據(jù)的爬取,這種模式我們通常稱它為單線程或者串行爬蟲。那么該如何改善呢?通過本章的學習你將掌握以下內(nèi)容:
?多線程:了解多線程的基本概念
?多進程:了解多進程的概念
?性能對比:通過一個爬蟲案例對比它們之間的性能
?多進程的使用
多線程與多進程
1. 多線程和多進程概述
當計算機運行程序時,就會創(chuàng)建包含代碼和狀態(tài)的進程。這些進程會通過計算機的一個或多個CPU執(zhí)行。不過,同一時刻每個CPU只會執(zhí)行一個進程,然后不同進程間快速切換,給我們一種錯覺,感覺好像多個程序在同時進行。
一個進程中,程序的執(zhí)行也是在不同的線程間進行切換,每個線程執(zhí)行程序的不同部分。
例如:有一個大型工廠,該工廠負責生產(chǎn)電腦,工廠有很多的車間用來生產(chǎn)不同的電腦部件。每個車間又有很多工人互相合作共享資源來生產(chǎn)某個電腦部件。這里的工廠相當于一個爬蟲工程,每個車間相當于一個進程,每個工人就相當于線程。
2. 多進程的使用方法
我們這里為大家介紹的是Python中的multiprocessing庫,使用方法如下:
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)運行結(jié)果:
這里只是獲取了用戶名的信息,大家可以將其他信息也爬取出來看看,動手試試看看能縮少多少時間。好了這周的內(nèi)容就這么多,雖然內(nèi)容不是很多,但卻很重要,大家要多多練習。
來和小伙伴們一起向上生長呀!掃描下方二維碼,添加小詹微信,可領(lǐng)取千元大禮包并申請加入 Python 學習交流群,群內(nèi)僅供學術(shù)交流,日常互動,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學習」,我會盡快通過好友申請哦!👆長按識別,添加微信(添加人數(shù)較多,請耐心等待)👆長按識別,關(guān)注小詹(掃碼回復 1024 領(lǐng)取程序員大禮包)
推薦閱讀:(點擊標題即可跳轉(zhuǎn))
總結(jié)
以上是生活随笔為你收集整理的超简单,带你学会多线程爬虫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Git学习笔记5】以普通模式合并(--
- 下一篇: 【Git学习笔记6】把当前工作现场“储藏