這篇文章主要介紹了python3爬蟲中多線程的使用示例,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
站在用戶的角度思考問題,與客戶深入溝通,找到平定網(wǎng)站設(shè)計與平定網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋平定地區(qū)。
本文教程操作環(huán)境:windows7系統(tǒng)、Python 3.9.1,DELL G3電腦。
一、Python的多線程爬蟲介紹:
1、Python的多線程并不如java的多線程,其差異在于當python解釋器開始執(zhí)行任務(wù)時,受制于GIL(全局解釋所),Python 的線程被限制到同一時刻只允許一個程執(zhí)行這樣一個執(zhí)行模型。
GIL介紹:
Python代碼的執(zhí)行由Python虛擬機(解釋器)來控制,同時只有一個線程在執(zhí)行。對Python虛擬機的訪問由全局解釋器鎖(GIL)來控制,正是這個鎖能保證同時只有一個線程在運行。
GIL功能:
為了線程間數(shù)據(jù)的一致性和狀態(tài)同步的完整性。
例如:線程2需要線程1執(zhí)行完成的結(jié)果,然而線程2又比線程1執(zhí)行時間短,線程2執(zhí)行完成,線程1仍然還在執(zhí)行,這就是數(shù)據(jù)的同步性。
2、Python 的線程更適用于處理 I/O 和其他需要并發(fā)行的阻塞操作(比如等待 I/O、等待從數(shù)據(jù)庫獲取數(shù)據(jù)等等),而不是需要多處理器行的計算密集型任務(wù)。幸運的是,爬蟲大部分時間在網(wǎng)絡(luò)交互上,所以可以使用多線程來編寫爬蟲。
二、多線程適用場景
在一個程序進程中,有些操作是比較耗時或者需要等待的。比如:等待數(shù)據(jù)庫的查詢結(jié)果的返回等待網(wǎng)頁結(jié)果的響應(yīng)。
使用單線程:
處理器必須要等到這些操作完成之后才能繼續(xù)往下執(zhí)行其他操作,而這個線程在等待的過程中,處理器明顯是可以來執(zhí)行其他操作的。
使用多線程:
處理器就可以在某個線程等待時,去執(zhí)行其他的線程,從而從整體上提高執(zhí)行效率。
三、多線程爬蟲使用方法
t1 = threading.Thread(targe=func,args=(,)) t1.setDaemon(True) t1.start() #此時線程才會啟動
threading模塊是python中專門提供用來做多線程編程的模塊。threading模塊中最常用的類是Thread。
import threading import time def coding(): for x in range(3): print('%s正在寫代碼' % x) time.sleep(1) def drawing(): for x in range(3): print('%s正在畫圖' % x) time.sleep(1) def single_thread(): coding() drawing() def multi_thread(): t1 = threading.Thread(target=coding) t2 = threading.Thread(target=drawing) t1.start() t2.start() if __name__ == '__main__': multi_thread()
四、設(shè)置爬蟲代理IP
在做爬蟲的過程中,如果你爬取的頻率過快,不符合人的操作模式。有些網(wǎng)站的反爬蟲機制通過監(jiān)測到你的IP異常,訪問頻率過高。就會對你進行封IP處理。目前已有比較多的第三方平臺專門進行代理IP的服務(wù)。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“python3爬蟲中多線程的使用示例”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!