Python3多線程爬蟲實(shí)例講解代碼
多線程概述
多線程使得程序內(nèi)部可以分出多個線程來做多件事情,充分利用CPU空閑時間,提升處理效率。python提供了兩個模塊來實(shí)現(xiàn)多線程thread 和threading ,thread 有一些缺點(diǎn),在threading 得到了彌補(bǔ)。并且在Python3中廢棄了thread模塊,保留了更強(qiáng)大的threading模塊。
使用場景
在python的原始解釋器CPython中存在著GIL(Global Interpreter Lock,全局解釋器鎖),因此在解釋執(zhí)行python代碼時,會產(chǎn)生互斥鎖來限制線程對共享資源的訪問,直到解釋器遇到I/O操作或者操作次數(shù)達(dá)到一定數(shù)目時才會釋放GIL。所以,雖然CPython的線程庫直接封裝了系統(tǒng)的原生線程,但CPython整體作為一個進(jìn)程,同一時間只會有一個獲得GIL的線程在跑,其他線程則處于等待狀態(tài)。這就造成了即使在多核CPU中,多線程也只是做著分時切換而已。
如果你的程序是CPU密集型,多個線程的代碼很有可能是線性執(zhí)行的。所以這種情況下多線程是雞肋,效率可能還不如單線程因?yàn)橛猩舷挛那袚Q開銷。但是如果你的代碼是IO密集型,涉及到網(wǎng)絡(luò)、磁盤IO的任務(wù)都是IO密集型任務(wù),多線程可以明顯提高效率,例如多線程爬蟲,多線程文件處理等等
多線程爬蟲
多線程爬蟲的代碼實(shí)例
注: 以下代碼在python3下運(yùn)行通過, python2版本差異較大,不能運(yùn)行成功,如需幫助請下方留意。
# coding=utf-8
import threading, queue, time, urllib
from urllib import request
baseUrl = 'http://www.pythontab.com/html/pythonjichu/'
urlQueue = queue.Queue()
for i in range(2, 10):
url = baseUrl + str(i) + '.html'
urlQueue.put(url)
#print(url)
def fetchUrl(urlQueue):
while True:
try:
#不阻塞的讀取隊(duì)列數(shù)據(jù)
url = urlQueue.get_nowait()
i = urlQueue.qsize()
except Exception as e:
break
print ('Current Thread Name %s, Url: %s ' % (threading.currentThread().name, url))
try:
response = urllib.request.urlopen(url)
responseCode = response.getcode()
except Exception as e:
continue
if responseCode == 200:
#抓取內(nèi)容的數(shù)據(jù)處理可以放到這里
#為了突出效果, 設(shè)置延時
time.sleep(1)
if __name__ == '__main__':
startTime = time.time()
threads = []
# 可以調(diào)節(jié)線程數(shù), 進(jìn)而控制抓取速度
threadNum = 4
for i in range(0, threadNum):
t = threading.Thread(target=fetchUrl, args=(urlQueue,))
threads.append(t)
for t in threads:
t.start()
for t in threads:
#多線程多join的情況下,依次執(zhí)行各線程的join方法, 這樣可以確保主線程最后退出, 且各個線程間沒有阻塞
t.join()
endTime = time.time()
print ('Done, Time cost: %s ' % (endTime - startTime))
運(yùn)行結(jié)果:
1個線程時:
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/3.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/4.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/6.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/8.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html Done, Time cost: 8.182249069213867
2個線程時:
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/4.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/8.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html Done, Time cost: 4.0987958908081055
3個線程時:
Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/4.html Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/5.html Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/7.html Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/8.html Done, Time cost: 2.287320137023926
通過調(diào)節(jié)線程數(shù)可以看到,執(zhí)行時間會隨著線程數(shù)的增加而縮短,抓取效率成正比增加。
總結(jié):
Python多線程在IO密集型任務(wù),多線程可以明顯提高效率,CPU密集型任務(wù)不適合使用多線程處理。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python基礎(chǔ)進(jìn)階之海量表情包多線程爬蟲功能的實(shí)現(xiàn)
- python3爬蟲中多線程進(jìn)行解鎖操作實(shí)例
- python3爬蟲GIL修改多線程實(shí)例講解
- python3爬蟲中多線程的優(yōu)勢總結(jié)
- python爬蟲開發(fā)之使用Python爬蟲庫requests多線程抓取貓眼電影TOP100實(shí)例
- python支持多線程的爬蟲實(shí)例
- python爬蟲中多線程的使用詳解
- Python 微信爬蟲完整實(shí)例【單線程與多線程】
- python面向?qū)ο蠖嗑€程爬蟲爬取搜狐頁面的實(shí)例代碼
- python爬蟲爬取快手視頻多線程下載功能
- php與python實(shí)現(xiàn)的線程池多線程爬蟲功能示例
- python 多線程爬取壁紙網(wǎng)站的示例
相關(guān)文章
Flask利用自定義接口實(shí)現(xiàn)mock應(yīng)用詳解
后端接口已提供,前端需要依賴后端接口返回的數(shù)據(jù)進(jìn)行前端頁面的開發(fā),如何配合前端?這篇就來介紹一下Flask如何利用自定義接口實(shí)現(xiàn)mock應(yīng)用,需要的可以參考一下2023-03-03
Pandas之缺失數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了Pandas之缺失數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python調(diào)用PC攝像頭實(shí)現(xiàn)掃描二維碼
PC攝像機(jī)掃描二維碼的應(yīng)用場景很廣泛,可以應(yīng)用于各種需要快速掃描、識別和管理的場景,本文就來具體講講如何用Python實(shí)現(xiàn)這一功能吧2023-05-05
PyCharm出現(xiàn)Error:Python?packaging?tool?'setuptools&apo
這篇文章主要給大家介紹了關(guān)于PyCharm出現(xiàn)Error:Python?packaging?tool?'setuptools'?not?found的解決辦法,文中通過圖文及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12

