《Python網(wǎng)絡爬蟲基礎教程》 課件-第6章 提升網(wǎng)絡爬蟲速度_第1頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第6章 提升網(wǎng)絡爬蟲速度_第2頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第6章 提升網(wǎng)絡爬蟲速度_第3頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第6章 提升網(wǎng)絡爬蟲速度_第4頁
《Python網(wǎng)絡爬蟲基礎教程》 課件-第6章 提升網(wǎng)絡爬蟲速度_第5頁
已閱讀5頁,還剩61頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第6章提升網(wǎng)絡爬蟲速度《Python網(wǎng)絡爬蟲基礎教程》學習目標/Target了解網(wǎng)絡爬蟲速度的提升方案,能夠說出多線程和協(xié)程的區(qū)別熟悉多線程爬蟲的運行流程,能夠歸納多線程爬蟲的運行流程掌握多線程爬蟲的實現(xiàn)技術,能夠使用threading和queue模塊實現(xiàn)多線程爬蟲熟悉協(xié)程爬蟲的運行流程,能夠歸納協(xié)程爬蟲的運行流程掌握協(xié)程爬蟲的實現(xiàn)技術,能夠使用asyncio和aiohttp庫實現(xiàn)協(xié)程爬蟲章節(jié)概述/Summary網(wǎng)絡環(huán)境不穩(wěn)定導致如下情況出現(xiàn):當基于單線程的網(wǎng)絡爬蟲采集網(wǎng)頁數(shù)據(jù)時,如果有一個網(wǎng)頁的響應速度慢或者網(wǎng)頁一直處于加載狀態(tài)中,那么網(wǎng)絡爬蟲需要等待該網(wǎng)頁加載完才能繼續(xù)采集。這顯然降低了網(wǎng)絡爬蟲的運行速度。為解決此問題,提升網(wǎng)絡爬蟲的運行速度,我們可以在網(wǎng)絡爬蟲程序中加入多線程、協(xié)程等技術,實現(xiàn)同時抓取或解析多個網(wǎng)頁的數(shù)據(jù)。目錄/Contents6.16.26.3網(wǎng)絡爬蟲速度提升方案多線程爬蟲協(xié)程爬蟲6.4實踐項目:采集黑馬頭條的評論列表網(wǎng)路爬蟲速度提升方案6.1了解網(wǎng)絡爬蟲速度的提升方案,能夠說出多線程和協(xié)程的區(qū)別學習目標6.1網(wǎng)絡爬蟲速度提升方案影響網(wǎng)絡爬蟲速度的因素主要是網(wǎng)絡I/O操作,原因在于網(wǎng)絡I/O操作的速度趕不上CPU的處理速度。網(wǎng)絡I/O操作可以理解為在網(wǎng)絡協(xié)議的支持下,一個主機通過網(wǎng)絡與其他主機進行數(shù)據(jù)傳輸?shù)倪^程。例如下載圖片就是一個網(wǎng)絡I/O操作。試想一下,網(wǎng)絡爬蟲正在執(zhí)行下載大量圖片的任務,它在下載圖片的過程中會一直處于阻塞狀態(tài)。這會導致CPU當前處于空閑狀態(tài),直到下載完圖片后才能讓CPU調(diào)度其他任務。這就造成了CPU的浪費。在Python中,提升網(wǎng)絡爬蟲程序運行速度主要有三種方案,分別是多進程、多線程和協(xié)程。6.1網(wǎng)絡爬蟲速度提升方案多進程多線程協(xié)程多進程可以利用多核CPU,將任務運行到不同的CPU上,實現(xiàn)同時執(zhí)行多個任務。進程的數(shù)量取決于計算機CPU的處理器個數(shù)。6.1網(wǎng)絡爬蟲速度提升方案多進程多線程協(xié)程多線程是以并發(fā)(一個時間段內(nèi)發(fā)生若干事情的情況)的方式執(zhí)行任務的,它不能實現(xiàn)真正地同時執(zhí)行多個任務,而是通過線程的快速切換提升程序的運行速度。6.1網(wǎng)絡爬蟲速度提升方案多進程多線程協(xié)程協(xié)程是以異步并發(fā)的方式執(zhí)行任務的,由于協(xié)程無需系統(tǒng)內(nèi)核的上下文切換,所以程序在執(zhí)行過程中可以避免大量的等待時間。6.1網(wǎng)絡爬蟲速度提升方案6.1網(wǎng)絡爬蟲速度提升方案網(wǎng)絡爬蟲如何選擇多進程、多線程和協(xié)程呢?多進程適用于CPU密集型的代碼,如循環(huán)處理、大量的密集并行計算等;多線程適用于I/O密集型的代碼,如文件處理、網(wǎng)絡交互等;協(xié)程適用于大量不需要CPU的操作(如網(wǎng)絡I/O)。結(jié)合多線程、多進程和多協(xié)程的特點和用途,一般會選擇多線程和協(xié)程技術開發(fā)網(wǎng)絡爬蟲程序。6.1網(wǎng)絡爬蟲速度提升方案多學一招進程是系統(tǒng)進行資源分配的最小單位,它擁有自己的內(nèi)存空間,每個進程之間的數(shù)據(jù)不共享。線程是系統(tǒng)調(diào)度執(zhí)行的最小單位,它不能獨立存在,必須依賴進程,每個線程之間的數(shù)據(jù)可以共享。協(xié)程是用戶態(tài)的輕量級線程,調(diào)度由用戶控制,擁有自己的寄存器上下文和棧。進程、線程和協(xié)程多線程爬蟲6.2熟悉多線程爬蟲的運行流程,能夠歸納多線程爬蟲的運行流程學習目標6.2.1多線程爬蟲流程分析6.2.1多線程爬蟲流程分析多線程爬蟲會將多線程技術運用在抓取網(wǎng)頁和解析網(wǎng)頁上,它的運行流程圖如右所示。6.2.1多線程爬蟲流程分析(1)構建一個網(wǎng)址隊列,用于存放網(wǎng)絡爬蟲待抓取數(shù)據(jù)的所有網(wǎng)址。(2)開啟多個線程抓取網(wǎng)頁。(3)將抓取到的網(wǎng)頁源碼存儲到網(wǎng)頁源碼隊列中。(4)開啟多個線程對網(wǎng)頁源碼隊列中的網(wǎng)頁數(shù)據(jù)進行解析。(5)將解析之后的數(shù)據(jù)存儲到網(wǎng)頁數(shù)據(jù)隊列中。(6)將網(wǎng)頁數(shù)據(jù)隊列中的數(shù)據(jù)進行存儲。多線程爬蟲的運行流程如下。掌握多線程爬蟲的實現(xiàn)技術,能夠使用threading和queue模塊實現(xiàn)多線程爬蟲學習目標6.2.2多線程爬蟲實現(xiàn)技術6.2.2多線程爬蟲實現(xiàn)技術由于線程具有獨立運行、狀態(tài)不可預測、執(zhí)行順序隨機的特點,當多個線程同時訪問同一份資源時,容易導致程序產(chǎn)生不可預料的結(jié)果,為此多線程爬蟲使用隊列管理網(wǎng)址或網(wǎng)頁源碼。Python中分別提供了支持多線程和隊列的內(nèi)置模塊threading和queue。

threading模塊模塊threading中定義了Thread類,該類專門用于管理線程。若希望在程序中創(chuàng)建一個線程(也稱子線程),需要實例化一個Thread類的對象。6.2.2多線程爬蟲實現(xiàn)技術Thread(group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)group:必須為None,目前未實現(xiàn),是為以后的擴展功能保留的預留參數(shù)。target:表示子線程的功能函數(shù),用于為子線程分派任務。name:線程的名稱,默認由“Thread-N”形式組成,其中N為十進制數(shù)。args:target指定函數(shù)的位置參數(shù)。kwargs:target指定函數(shù)的關鍵字參數(shù)。daemon:表示是否將線程設為守護線程(在后臺運行的一類特殊線程,用于執(zhí)行特定的任務)6.2.2多線程爬蟲實現(xiàn)技術classMyThread(Thread):def__init__(self,num):super().__init__()='線程'+str(num)defrun(self):message=+'運行'print(message)thread_two=MyThread(1)方式二fromthreadingimportThread#任務函數(shù)deftask():print('線程運行')thread_one=Thread(target=task)

方式一Python創(chuàng)建線程的方式。

Queue模塊Python的queue模塊中提供了3個表示同步的、線程安全的隊列的類,這些隊列類包括Queue類、LifoQueue類和PriorityQueue類,隊列是線程間常用的交換數(shù)據(jù)的形式。6.2.2多線程爬蟲實現(xiàn)技術fromqueueimportQueuequeue_object=Queue(10)foriinrange(4):queue_object.put(i)whilenotqueue_object.empty():print(queue_object.get())Queue類Queue類表示一個基本的FIFO(FirstInFirstOut)隊列,即先進先出,也就是說先存入隊列中的元素先取出來。

Queue模塊6.2.2多線程爬蟲實現(xiàn)技術fromqueueimportLifoQueuelifo_queue=LifoQueue()foriinrange(4):lifo_queue.put(i)whilenotlifo_queue.empty():print(lifo_queue.get())LifoQueue類LifoQueue類表示一個LIFO(LastinFirstOut)隊列,與棧類似,即后進先出,也就是說后存入隊列中的元素先取出來。

Queue模塊6.2.2多線程爬蟲實現(xiàn)技術fromqueueimportPriorityQueueclassJob:def__init__(self,level,description):self.level=levelself.description=descriptionreturndef__lt__(self,other):returnself.level<other.levelpriority_queue=PriorityQueue()priority_queue.put(Job(5,'中級別工作'))priority_queue.put(Job(10,'低級別工作'))priority_queue.put(Job(1,'重要工作'))whilenotpriority_queue.empty():next_job=priority_queue.get()print('開始工作:',next_job.description)PriorityQueue類PriorityQueue類表示優(yōu)先級隊列,它按級別順序取出元素,級別最低的最先取出。6.2.2多線程爬蟲實現(xiàn)技術為了便于管理隊列的元素,Queue類中提供了一些常用方法,這些方法的說明如下表所示。方法說明qsize()返回隊列的大小empty()如果隊列為空,返回True,否則為Falsefull()如果隊列滿了,返回True,否則為Falseget()從隊頭獲取并刪除第一個元素put()將一個元素放入隊列末尾join()阻塞線程,直至隊列中所有元素被處理完task_done()在完成一項工作之后,task_done()函數(shù)向任務已經(jīng)完成的隊列發(fā)送一個信號get_nowait()立即取出一個元素,無需額外等待put_nowait()立即放入一個元素,無需額外等待掌握多線程爬蟲的實現(xiàn)技術,能夠使用多線程技術抓取黑馬程序員論壇網(wǎng)站數(shù)據(jù)學習目標6.2.3多線程爬蟲基本示例6.2.3多線程爬蟲基本示例以黑馬程序員論壇網(wǎng)站為例,帶領大家一起使用threading和queue模塊實現(xiàn)多線程爬蟲,并讓多線程爬蟲采集Python技術交流版塊中所有帖子的文章標題、文章作者、文章鏈接以及發(fā)布時間。案例需求6.2.3多線程爬蟲基本示例案例步驟案例分析定義HeiMa類構造請求網(wǎng)址定義數(shù)據(jù)存儲方法定義提取方法定義抓取方法6.2.3多線程爬蟲基本示例執(zhí)行代碼運行代碼后,可以看到在代碼文件同級目錄下添加了一個新的文件thread-heima.json,該文件中存儲了Python技術交流版塊中所有貼子的文章標題、文章作者、文章鏈接和發(fā)布時間。[單擊查看源碼]熟悉多線程爬蟲性能分析,能夠計算出多線程爬蟲耗時時間學習目標6.2.4多線程爬蟲性能分析6.2.4多線程爬蟲性能分析if__name__=="__main__":begin_page=int(input("請輸入起始頁碼:"))end_page=int(input("請輸入結(jié)束頁碼:"))s_time=time.time()heima_forum(begin_page,end_page)e_time=time.time()print(f'總用時:{e_time-s_time}秒')在4.6節(jié)中,編寫了一個單線程爬蟲采集Python+人工智能技術交流版塊中所有貼子的文章標題、文章作者、文章鏈接和發(fā)布時間。使用time模塊計算此爬蟲運行時間。運行代碼,在控制臺中輸入起始頁碼為1,結(jié)束頁碼為70,按下回車后輸出的結(jié)果如下??傆脮r:17.572004795074463秒6.2.4多線程爬蟲性能分析if__name__=='__main__':s_time=time.time()heima=HeiMa()heima.run()e_time=time.time()print(f'總用時:{e_time-s_time}秒')在6.2.3小節(jié)項目的main語句中添加網(wǎng)絡爬蟲耗時計算的代碼。運行代碼,在控制臺中輸入起始頁碼為1,結(jié)束頁碼為70,按下回車后輸出的結(jié)果如下??傆脮r:3.3751931190490723秒6.2.4多線程爬蟲性能分析通過比較單線程爬蟲和多線程爬蟲耗費的時長可知,在相同的條件下,多線程的性能優(yōu)于單線程爬蟲的性能。協(xié)程爬蟲6.3熟悉協(xié)程爬蟲的運行流程,能夠歸納協(xié)程爬蟲的運行流程學習目標6.3.1協(xié)程爬蟲流程分析6.3.1協(xié)程爬蟲流程分析由于協(xié)程的切換不像多線程調(diào)度那樣耗費資源,所以我們不用嚴格限制協(xié)程的數(shù)量,它的運行流程圖如右所示。(1)構建一個網(wǎng)址列表,由于要為每個網(wǎng)址分配一個協(xié)程,所以需要準備一個網(wǎng)址列表。(2)為每個網(wǎng)址分配一個協(xié)程,每個協(xié)程負責先抓取源碼,再對這些源碼進行解析并從中提取出目標數(shù)據(jù)。(3)將提取的目標數(shù)據(jù)存儲到數(shù)據(jù)列表中。(4)遍歷步驟(3)的數(shù)據(jù)列表,將取出的數(shù)據(jù)進行存儲。協(xié)程爬蟲的運行流程如下。6.3.1協(xié)程爬蟲流程分析掌握協(xié)程爬蟲的實現(xiàn)技術,能夠使用asyncio和aiohttp庫實現(xiàn)協(xié)程爬蟲學習目標6.3.2協(xié)程爬蟲實現(xiàn)技術Python中提供了支持協(xié)程的內(nèi)置庫asyncio,該庫經(jīng)常會與第三方庫aiohttp配合使用,以幫助開發(fā)人員快速實現(xiàn)協(xié)程爬蟲。另外,我們也可以使用aiofiles庫將爬蟲解析完的數(shù)據(jù)實現(xiàn)異步寫入。6.3.2協(xié)程爬蟲實現(xiàn)技術

asyncio庫importasyncioasyncdefmain(): #定義協(xié)程

print('hello')awaitasyncio.sleep(1)#阻塞等待1秒

print('world')在asyncio庫中,async/await

關鍵字用于定義協(xié)程,其中關鍵字async位于關鍵字def的前面,表明async修飾的函數(shù)是一個協(xié)程函數(shù),而不是普通函數(shù);關鍵字await位于協(xié)程函數(shù)內(nèi)部,該關鍵字的后面需要跟著可等待對象(協(xié)程對象、協(xié)程任務和Future類的對象),表明當前協(xié)程會被掛起并主動讓出執(zhí)行權。6.3.2協(xié)程爬蟲實現(xiàn)技術

asyncio庫asyncdefmain():task1=asyncio.create_task(coroutine_one())task2=asyncio.create_task(coroutine_two())awaittask1awaittask2loop=asyncio.get_event_loop() loop.run_until_complete(main()) 要想運行創(chuàng)建的協(xié)程,可以通過asyncio庫的run()和run_until_complete()方法實現(xiàn)。6.3.2協(xié)程爬蟲實現(xiàn)技術asyncio.run(main()) 方式一方式二

aiohttp庫aiohttp庫是一個為Python提供的異步HTTP客戶端/服務端編程的第三方庫,在使用之前需要先進行安裝。6.3.2協(xié)程爬蟲實現(xiàn)技術pipinstallaiohttp

aiohttp庫aiohttp庫中提供了一個status屬性,status屬性用于獲取請求的狀態(tài)碼,另外aiohttp庫中還提供了很多方法。6.3.2協(xié)程爬蟲實現(xiàn)技術方法說明ClientSession()用于創(chuàng)建客戶端會話text()以字符串形式顯示服務器內(nèi)容json()以JSON形式響應服務器內(nèi)容read()返回二進制文本post()發(fā)送POST請求get()發(fā)送GET請求

aiohttp庫使用aiohttp庫的get()方法請求百度首頁,具體代碼如下所示。6.3.2協(xié)程爬蟲實現(xiàn)技術importasyncio,aiohttpasyncdefmain():#使用with語句的上下文管理器,保證處理session之后正確關閉

asyncwithaiohttp.ClientSession()assession:#使用get()方法發(fā)送GET請求

asyncwithsession.get('/')asresp:print(resp.status) #輸出響應狀態(tài)碼asyncio.run(main())

aiofiles庫aiofiles庫提供文件異步操作,并非Python的標準庫,所以使用之前需要先進行安裝。6.3.2協(xié)程爬蟲實現(xiàn)技術pipinstallaiofiles

aiofiles庫aiofiles庫中提供了許多與處理Python文件相似的方法,常用方法如下所示。6.3.2協(xié)程爬蟲實現(xiàn)技術方法說明open()使用協(xié)程打開一個文件close()使用協(xié)程關閉文件read()使用協(xié)程讀取文件,可設置讀取的字節(jié)數(shù)realall()使用協(xié)程讀取文件所有內(nèi)容write()使用協(xié)程寫入文件數(shù)據(jù),可設置寫入的字符長度writelines()使用協(xié)程寫入文件數(shù)據(jù),每次寫入一行數(shù)據(jù)

aiofiles庫使用aiofiles庫向文件寫入并讀取數(shù)據(jù),具體如下。6.3.2協(xié)程爬蟲實現(xiàn)技術importasyncio,aiofilesasyncdefwirte_demo():asyncwithaiofiles.open("text.txt","w",encoding="utf-8")asfp:awaitfp.write("helloworld")print("數(shù)據(jù)寫入成功")asyncdefread_demo():asyncwithaiofiles.open("text.txt","r",encoding="utf-8")asfp:content=awaitfp.read()print(content)多學一招事件循環(huán)是每個asyncio

應用的核心。事件循環(huán)會運行異步任務和回調(diào),執(zhí)行網(wǎng)絡IO操作,以及運行子程序。await語句后需要跟隨可等待對象,“可等待”可理解為跳轉(zhuǎn)到等待對象,并將當前任務掛起,當?shù)却龑ο蟮娜蝿仗幚硗瓿?,再跳回當前任務繼續(xù)執(zhí)行。asyncio庫中的可等待對象包括協(xié)程對象、協(xié)程任務和Future對象。可等待對象和事件循環(huán)掌握協(xié)程爬蟲的實現(xiàn)技術,能夠使用協(xié)程技術抓取黑馬程序員論壇網(wǎng)站數(shù)據(jù)學習目標6.3.3協(xié)程爬蟲基本示例以黑馬程序員論壇網(wǎng)站為例,帶領大家一起使用aiohttp、asyncio和aiofiles模塊實現(xiàn)協(xié)程爬蟲,并讓協(xié)程爬蟲采集Python技術交流版塊中所有帖子的文章標題、文章作者、文章鏈接以及發(fā)布時間。6.3.3協(xié)程爬蟲基本示例案例需求案例步驟6.3.3協(xié)程爬蟲基本示例導入相關模塊,定義協(xié)程函數(shù)定義請求網(wǎng)址并提取數(shù)據(jù)創(chuàng)建事件循環(huán),啟動協(xié)程函數(shù)123執(zhí)行代碼當程序運行后,可以看到在代碼文件同級目錄下添加了一個新的文件coroutine-heima.json,該文件存儲了黑馬程序員論壇中1~70頁的文章標題、文章作者、文章鏈接和發(fā)布時間。6.3.3協(xié)程爬蟲基本示例[單擊查看源碼]熟悉協(xié)程爬蟲性能分析,能夠計算出協(xié)程爬蟲耗時時間學習目標6.3.4協(xié)程爬蟲性能分析if__name__=='__main__':s_time=time.time()loop=asyncio.get_event_loop()#創(chuàng)建事件循環(huán)

loop.run_until_complete(main())e_time=time.time()print(f'總用時:{e_time-s_time}秒')為了對協(xié)程爬蟲的性能進行分析,在6.3.3小節(jié)的示例的基礎上,增加網(wǎng)絡爬蟲耗時計算的代碼,比較單線程爬蟲和協(xié)程爬蟲在采集相同數(shù)據(jù)時總共耗費的時長。運行代碼,結(jié)果如下??傆脮r:3.2851879596710205秒6.3.4協(xié)程爬蟲性能分析通過比較單線程爬蟲和協(xié)程爬蟲耗費的時長可知,在相同的條件下,協(xié)程爬蟲的性能優(yōu)于單線程爬蟲的性能。6.3.4協(xié)程爬蟲性能分析[單擊查看源碼]實踐項目:使用多線程采集黑馬頭條的評論列表6.4掌握黑馬頭條數(shù)據(jù)的抓取,能夠使用多線程采集黑馬頭條的評論列表學習目標6.4使用多線程采集黑馬頭條的評論列表黑馬頭條是一款新聞資訊類項目,由用戶端、自媒體端、管理后臺端組成完整的業(yè)務閉環(huán),通過大數(shù)據(jù)平臺分析用戶喜好,為用戶精準推送資訊新聞。本節(jié)將使用多線程的知識開發(fā)一個多線程爬蟲項目,采集黑馬頭條自媒體端指定頁面范圍的評論列表。6.4使用多線程采集黑馬頭條的評論列表

項目需求訪問黑馬頭條自媒體端登錄頁面,使用默認的賬號密碼登錄后,在左側(cè)的菜單欄中選擇“內(nèi)容管理”→“評論列表”進入評論列表頁面。

項目目標6.4使用多線程采集黑馬頭條的評論列表首先判斷待提取的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論