python爬蟲進(jìn)階之協(xié)程詳解
更新時間:2023年08月09日 10:58:54 作者:南岸青梔*
這篇文章主要介紹了python爬蟲進(jìn)階之協(xié)程詳解,coroutine中文翻譯叫協(xié)程,在 Python 中昌指代為協(xié)程對象類型,可以將協(xié)程對象注冊到時間循環(huán)中被調(diào)用,需要的朋友可以參考下
python爬蟲–協(xié)程
基本知識
- event_loop:事件循環(huán),相當(dāng)于一個無限循環(huán),我們可以把一些函數(shù)注冊到這個事件循環(huán)上,當(dāng)滿足某些條件的時候,函數(shù)就會被循環(huán)執(zhí)行。
- coroutine:攜程對象,我們可以將攜程對象注冊到事件循環(huán)中,它會被時間循環(huán)調(diào)用。我們可以使用async關(guān)鍵字來定義一個方法,這個方法在調(diào)用時不會被立即執(zhí)行,而是返回一個協(xié)程對象。
- task:任務(wù),它是對協(xié)程對象的進(jìn)一步封裝, 包含了任務(wù)的各個狀態(tài)。
- future:代表將來執(zhí)行或還沒有執(zhí)行的任務(wù),實際上和task 沒有本質(zhì)區(qū)別。
- async定義-個協(xié)程.
- await用來掛起阻塞方法的執(zhí)行。
協(xié)程的基本使用
import asyncio async def request(url): print('正在請求的url是:',url) print('請求成功:',url) #async修飾的函數(shù),調(diào)用之后返回的一個協(xié)程對象 c = request('www.baidu.com') # #創(chuàng)建一個事件循環(huán)對象 # loop = asyncio.get_event_loop() # # #將攜程對象注冊到loop中,然后啟動loop # loop.run_until_complete(c) # #task的使用 # loop = asyncio.get_event_loop() # #基于loop創(chuàng)建一個task對象 # task = loop.create_task(c) # print(task) # loop.run_until_complete(task) # print(task) #future的使用 loop = asyncio.get_event_loop() task = asyncio.ensure_future(c) print(task) loop.run_until_complete(task) print(task)
多任務(wù)協(xié)程實現(xiàn)
import asyncio import time async def request(url): print('正在請求的url是:',url) #在異步協(xié)程中如果出現(xiàn)同步模塊相關(guān)的代碼,那么就無法實現(xiàn)異步 #time.sleep(2) await asyncio.sleep(2) print('請求成功:',url) #async修飾的函數(shù),調(diào)用之后返回的一個協(xié)程對象 start = time.time() urls = { 'www.123.com', 'www.234.com', 'www.345.com' } #存放多個任務(wù)對象 stask = [] for url in urls: c = request(url) task = asyncio.ensure_future(c) stask.append(task) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(stask)) print(time.time()-start)
多任務(wù)協(xié)程異步實現(xiàn)
在進(jìn)行多任務(wù)協(xié)程實現(xiàn)前,還需要建立一個簡單的本地http服務(wù)
from flask import Flask import time app = Flask(__name__) @app.route('/azb') def index_azb(): time.sleep(2) return 'Hello azb' @app.route('/xx') def index_xx(): time.sleep(2) return 'Hello xx' @app.route('/hh') def index_hh(): time.sleep(2) return 'Hello hh' if __name__ == '__main__': app.run(threaded=True)
實現(xiàn)
import requests,asyncio,time start = time.time() urls = [ 'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh' ] async def get_page(url): print('正在下載',url) #request是基于同步,必須使用基于異步的網(wǎng)絡(luò)請求模塊 response = requests.get(url=url) print('下載成功!',url) tasks = [] for url in urls: c = get_page(url) task = asyncio.ensure_future(c) tasks.append(task) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) print('總耗時',time.time()-start)
aiohttp模塊引入
import requests,asyncio,time,aiohttp start = time.time() urls = [ 'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh' ] async def get_page(url): async with aiohttp.ClientSession() as session: async with await session.get(url) as response: #text()返回字符串形式的響應(yīng)數(shù)據(jù) #read()返回的二進(jìn)制形式的響應(yīng)數(shù)據(jù) #json()返回的就是json對象 #獲取響應(yīng)數(shù)據(jù)操作之前一定要使用await進(jìn)行手動掛起 page_text = await response.text() print(page_text) tasks = [] for url in urls: c = get_page(url) task = asyncio.ensure_future(c) tasks.append(task) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) print('總耗時',time.time()-start)
到此這篇關(guān)于python爬蟲進(jìn)階之協(xié)程詳解的文章就介紹到這了,更多相關(guān)python協(xié)程爬蟲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python把對應(yīng)格式的csv文件轉(zhuǎn)換成字典類型存儲腳本的方法
今天小編就為大家分享一篇Python把對應(yīng)格式的csv文件轉(zhuǎn)換成字典類型存儲腳本的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02python re.sub()替換正則的匹配內(nèi)容方法
今天小編就為大家分享一篇python re.sub()替換正則的匹配內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python中的os.path路徑模塊中的操作方法總結(jié)
os.path模塊主要集成了針對路徑文件夾的操作功能,這里我們就來看一下Python中的os.path路徑模塊中的操作方法總結(jié),需要的朋友可以參考下2016-07-07python使用for...else跳出雙層嵌套循環(huán)的方法實例
這篇文章主要給大家介紹了關(guān)于python使用for...else跳出雙層嵌套循環(huán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05