開始學著利用協程做非同步爬蟲,直接上**:
from flask importflask
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 tomhello tom
hello tom
3.0251729488372803
很明顯,利用協程做了,但是沒有實現併發,時間還是3s多一點。
輸出:
hello tomhello tom
hello tom
1.0150578022003174
下邊解釋下**:
return ret這個協程函式的功能是建立協程物件,訪問乙個形參url,返回的是響應結果。
獲取響應結果與requests模組略有不同:
返回字串
res.text()
res.text
返回二進位制資料(影象、音訊)
res.read()
res.content
json
res.json()
res.json()
async def這個主函式就不用說了,關鍵是asyncio.run(main())執行mian()協程函式,前邊的main()函式定義的也是協程函式,記住就可以。這個函式的功能是為協程物件建立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)
例子:
import新增的部分就是紅色字型部分,不需要管啥意思,乙個固定用法而已,參考:
輸出:
hello tomhello 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...