非同步爬蟲(五) aiohttp

2022-06-24 19:21:10 字數 4378 閱讀 2527

開始學著利用協程做非同步爬蟲,直接上**:

from flask import

flask

import

time)'

/tom')

defindex_tom():

time.sleep(1)

return

'hello tom'if

__name__ == '

__main__':

訪問返回乙個『hello tom』,中間等待1s。

import

requests

print(requests.get(url='

').text)

輸出:

hello tom

來乙個利用協程爬蟲的**:

輸出 :

hello tom

hello tom

hello tom

3.0251729488372803

很明顯,利用協程做了,但是沒有實現併發,時間還是3s多一點。

輸出:

hello tom

hello tom

hello tom

1.0150578022003174

下邊解釋下**:

return ret這個協程函式的功能是建立協程物件,訪問乙個形參url,返回的是響應結果。

獲取響應結果與requests模組略有不同:

返回字串

res.text()

res.text

返回二進位制資料(影象、音訊)

res.read()

res.content

json

res.json()

res.json()

async def 

這個函式的功能是為協程物件建立task物件,並新增到迴圈事件中,並執行這個迴圈事件。tasks = tasks是乙個列表,每乙個元素是建立的task物件。asyncio.create_task()前邊提到過,是建立task物件。done,pending = await asyncio.wait(tasks),這個就是執行這個迴圈事件,返回的結果以集合形式在done中,所以後邊的for迴圈就是獲取每個task的結果。也可以使用**機制,具體可參考 :  

所以我們可以在for迴圈這裡中持久化儲存,也就是將返回結果儲存在本地。這個過程是乙個cpu繁忙型任務,所以用協程提高效率的意義不大,直接用序列就可以。

if __name__ == '__main__':

start_time = time.time()

asyncio.run(main())

end_time = time.time()

print(end_time-start_time)

這個主函式就不用說了,關鍵是asyncio.run(main())執行mian()協程函式,前邊的main()函式定義的也是協程函式,記住就可以。

例子:

import

新增的部分就是紅色字型部分,不需要管啥意思,乙個固定用法而已,參考:  

輸出:

hello tom

hello tom

hello tom

hello tom

2.061117649078369

結果很明顯了,4個協程物件,2個2個併發的。

分享乙個寫的非常好,非常全的部落格:  

end_time

使用aiohttp非同步爬取小說

哈嘍,在這個寂寞的下午來看看這篇很水的文章 使用aiohttp爬取 首先,簡單說下同步和非同步。個人理解蛤,舉個例子 同步就是,你去買泡麵,買完得等商家算錢,算完錢了,你才能離開店鋪。非同步就是,晚上吃個泡麵,先燒個水,那麼在等水開的時候,就可以撕泡麵的包裝,醬料包,然後等到水開了泡就是了 苦逼單身...

非同步網路程式設計aiohttp的使用

aiohttp的使用 安裝 pip install asyncio因為有的 請求的時候會驗證ssl證書,如果是自簽名的ssl證書會出錯。conn aiohttp.tcpconnector verify ssl false 防止ssl報錯class aiohttp.tcpconnector ssl n...

aiohttp 支援非同步的網路請求模組

通常在進行網路資料採集時候我們會用到requests,urllib等模組,但是這些模組在使用中並不支援非同步,所以今天我們介紹乙個支援非同步網路請求的模組aiohttp.首先我們使用flask簡單的搭乙個伺服器 from flask import flask def xiaohua return i...