asyncio庫和aiohttp庫的學習
阿新 • • 發佈:2021-01-13
技術標籤:筆記python列表python多執行緒aioasynctask
前面部落格講的太泛了,對於我搞爬蟲就細化學習理解一波,基於這篇部落格的學習
由於requests庫和asyncio庫是不能一起使用的,所以我們要安裝一點小外掛pip install aiohttp
先上程式碼
import asyncio
import aiohttp
async def func(url):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
print('開始下載',url)
async with aiohttp.ClientSession() as session:
async with await session.get(url=url,headers=headers) as response:
data = await response.read()
name = url.split('/')[-1]
with open(name,'wb') as fp:
fp.write(data)
print('下載完成',url)
urls = ['https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_01.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_02.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_03.png'
]
tasks=[]
for url in urls:
a = func(url)
task = asyncio.ensure_future(a)
tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
基本步驟:
- 匯入庫
這裡注意不使用requests
了,直接使用aiohttp
import asyncio
import aiohttp
- 建立任務單
urls = ['https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_01.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_02.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_03.png'
]
- 用迴圈對每一條任務進行操作
for url in urls:
- 建立協程物件
a = func(url)
- 將任務封裝
使用asyncio.ensure_future()
來封裝
ensure_future
其實是用來建立任務的
tasks = [] # 這個寫在迴圈外面
task = asyncio.ensure_future(a)
tasks.append(task)
- 建立事件迴圈
利用asyncio.get_event_loop()
建立事件迴圈
loop = asyncio.get_event_loop()
- 把任務列表放到事件迴圈裡面
執行
運用這個函式執行執行任務單.run_until_complete()
這個函式的引數是future或者協程
這個函式asyncio.wait()
叫簡單等待
如果引數可以是一個任務單列表,如果裡面有協程(或者其他的可等待物件)它將自動作為任務加入日程。
loop.run_until_complete(asyncio.wait(tasks))
- 定義一個爬蟲協程
這個爬蟲的特點是url要從外面匯入
注意的是aiohttp
的使用
格式比較固定,套著用就是了
async def func(url):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
print('開始下載',url)
# 類似於上下文管理器,就是with open,with前面一定要加async,固定寫法
# as session是類似起名字一樣
async with aiohttp.ClientSession() as session:
# async with跟上面同理,await是手動掛起,因為向圖片發起請求是IO操作
async with await session.get(url=url,headers=headers) as response:
# 同樣的,對返回的資料進行解析也是IO操作
# 不同於requests模組,read()指的是解析二進位制資料
# text() 就是我們平時用的text
# 而json物件則要用json()
data = await response.read()
name = url.split('/')[-1]
with open(name,'wb') as fp:
fp.write(data)
print('下載完成',url)
- 執行一波
啪的一下很快啊