欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何分析Python多線程在爬蟲中的應(yīng)用

本篇文章為大家展示了如何分析Python多線程在爬蟲中的應(yīng)用,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都茶樓設(shè)計小微創(chuàng)業(yè)公司專業(yè)提供成都企業(yè)網(wǎng)站建設(shè)營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

作為測試工程師經(jīng)常需要解決測試數(shù)據(jù)來源的問題,解決思路無非是三種:

1、直接從生產(chǎn)環(huán)境拷貝真實數(shù)據(jù)

2、從互聯(lián)網(wǎng)上爬取數(shù)據(jù)

3、自己用腳本或者工具造數(shù)據(jù)。

前段時間,為了獲取更多的測試數(shù)據(jù),筆者就做了一個從互聯(lián)網(wǎng)上爬取數(shù)據(jù)的爬蟲程序,雖然功能上基本滿足項目的需求,但是爬取的效率還是不太高。

作為一個精益求精的測試工程師,決定研究一下多線程在爬蟲領(lǐng)域的應(yīng)用,以提高爬蟲的效率。

一、為什么需要多線程

凡事知其然也要知其所以然。在了解多線程的相關(guān)知識之前,我們先來看看為什么需要多線程。打個比方吧,你要搬家了,單線程就類似于請了一個搬家工人,他一個人負責打包、搬運、開車、卸貨等一系列操作流程,這個工作效率可想而知是很慢的;而多線程就相當于請了四個搬家工人,甲打包完交給已搬運到車上,然后丙開車送往目的地,最后由丁來卸貨。

由此可見多線程的好處就是高效、可以充分利用資源,壞處就是各個線程之間要相互協(xié)調(diào),否則容易亂套(類似于一個和尚挑水喝、兩個和尚抬水喝、三個和尚沒水喝的窘境)。所以為了提高爬蟲效率,我們在使用多線程時要格外注意多線程的管理問題。

二、多線程的基本知識

進程:由程序,數(shù)據(jù)集,進程控制塊三部分組成,它是程序在數(shù)據(jù)集上的一次運行過程。如果同一段程序在某個數(shù)據(jù)集上運行了兩次,那就是開啟了兩個進程。進程是資源管理的基本單位。在操作系統(tǒng)中,每個進程有一個地址空間,而且默認就有一個控制進程。

線程:是進程的一個實體,是 CPU 調(diào)度和分派的基本單位,也是最小的執(zhí)行單位。它的出現(xiàn)降低了上下文切換的消耗,提高了系統(tǒng)的并發(fā)性,并克服了一個進程只能干一件事的缺陷。線程由進程來管理,多個線程共享父進程的資源空間。

進程和線程的關(guān)系:

一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。

資源分配給進程,同一進程的所有線程共享該進程的所有資源。

CPU 分給線程,即真正在 CPU 上運行的是線程。

線程的工作方式:

如下圖所示,串行指線程一個個地在 CPU 上執(zhí)行;并行是在多個 CPU 上運行多個

線程;而并發(fā)是一種“偽并行”,一個 CPU 同一時刻只能執(zhí)行一個任務(wù),把 CPU 的時間

分片,一個線程只占用一個很短的時間片,然后各個線程輪流,由于時間片很短所以在

用戶看來所有線程都是“同時”的。并發(fā)也是大多數(shù)單 CPU 多線程的實際運行方式。

如何分析Python多線程在爬蟲中的應(yīng)用點擊添加圖片描述(最多60個字)

進程的工作狀態(tài):

一個進程有三種狀態(tài):運行、阻塞、就緒。三種狀態(tài)之間的轉(zhuǎn)換關(guān)系如下圖所示:運行態(tài)的進程可能由于等待輸入而主動進入阻塞狀態(tài),也可能由于調(diào)度程序選擇其他進程而被動進入就緒狀態(tài)(一般是分給它的 CPU 時間到了);阻塞狀態(tài)的進程由于等到了有效的輸入而進入就緒狀態(tài);就緒狀態(tài)的進程因為調(diào)度程序再次選擇了它而再次進入運行狀態(tài)。

如何分析Python多線程在爬蟲中的應(yīng)用點擊添加圖片描述(最多60個字)

三、多線程通信實例

還是回到爬蟲的問題上來,我們知道爬取博客文章的時候都是先爬取列表頁,然后根據(jù)列表頁的爬取結(jié)果再來爬取文章詳情內(nèi)容。而且列表頁的爬取速度肯定要比詳情頁的爬取速度快。

這樣的話,我們可以設(shè)計線程 A 負責爬取文章列表頁,線程 B、線程 C、線程 D 負責爬取文章詳情。A 將列表 URL 結(jié)果放到一個類似全局變量的結(jié)構(gòu)里,線程 B、C、D從這個結(jié)構(gòu)里取結(jié)果。

在 PYTHON 中,有兩個支持多線程的模塊:threading 模塊--負責線程的創(chuàng)建、開啟等操作;queque 模塊--負責維護那個類似于全局變量的結(jié)構(gòu)。

這里還要補充一點:也許有同學會問直接用一個全局變量不就可以了么?干嘛非要用 queue?

因為全局變量并不是線程安全的,比如說全局變量里(列表類型)只有一個 url 了,線程 B 判斷了一下全局變量非空,在還沒有取出該 url 之前,cpu 把時間片給了線程 C,線程 C 將最后一個url 取走了,這時 cpu 時間片又輪到了 B,B 就會因為在一個空的列表里取數(shù)據(jù)而報錯。

而 queue 模塊實現(xiàn)了多生產(chǎn)者、多消費者隊列,在放值取值時是線程安全的。

廢話不多說了,直接上代碼給大伙看看:

import threading # 導入 threading 模塊

from queue import Queue #導入 queue 模塊

import time #導入 time 模塊

# 爬取文章詳情頁

def get_detail_html(detail_url_list, id):

while True:

url = detail_url_list.get() #Queue 隊列的 get 方法用于從隊列中提取元素

time.sleep(2) # 延時 2s,模擬網(wǎng)絡(luò)請求和爬取文章詳情的過程

print("thread {id}: get {url} detail finished".format(id=id,url=url)) #打印線程 id 和被爬取了文章內(nèi)容的 url

# 爬取文章列表頁

def get_detail_url(queue):

for i in range(10000):

time.sleep(1) # 延時 1s,模擬比爬取文章詳情要快

queue.put("http://testedu.com/{id}".format(id=i))#Queue 隊列的 put 方法用于向 Queue 隊列中放置元素,由于 Queue 是先進先出隊列,所以先被 Put 的 URL 也就會被先 get 出來。

print("get detail url {id} end".format(id=i))#打印出得到了哪些文章的 url

#主函數(shù)

if __name__ == "__main__":

detail_url_queue = Queue(maxsize=1000) #用 Queue 構(gòu)造一個大小為 1000 的線程安全的先進先出隊列

# 先創(chuàng)造四個線程

thread = threading.Thread(target=get_detail_url, args=(detail_url_queue,)) #A 線程負責抓取列表

url

html_thread= []

for i in range(3):

thread2 = threading.Thread(target=get_detail_html, args=(detail_url_queue,i))

html_thread.append(thread2)#B C D 線程抓取文章詳情

start_time = time.time()

# 啟動四個線程

thread.start()

for i in range(3):

html_thread[i].start()

# 等待所有線程結(jié)束,thread.join()函數(shù)代表子線程完成之前,其父進程一直處于阻塞狀態(tài)。

thread.join()

for i in range(3):

html_thread[i].join()

print("last time: {} s".format(time.time()-start_time))#等 ABCD 四個線程都結(jié)束后,在主進程中計算總爬取時間。

運行結(jié)果:

如何分析Python多線程在爬蟲中的應(yīng)用

從運行結(jié)果可以看出各個線程之間井然有序地工作著,沒有出現(xiàn)任何報錯和告警的情況??梢娛褂?Queue 隊列實現(xiàn)多線程間的通信比直接使用全局變量要安全很多。而且使用多線程比不使用多線程的話,爬取時間上也要少很多,在提高了爬蟲效率的同時也兼顧了線程的安全,可以說在爬取測試數(shù)據(jù)的過程中是非常實用的一種方式。

上述內(nèi)容就是如何分析Python多線程在爬蟲中的應(yīng)用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前標題:如何分析Python多線程在爬蟲中的應(yīng)用
新聞來源:http://chinadenli.net/article30/jieepo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、定制網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)站收錄、關(guān)鍵詞優(yōu)化、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計