1. 程式人生 > 其它 >asyncio庫和aiohttp庫的學習

asyncio庫和aiohttp庫的學習

技術標籤:筆記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)
  • 執行一波
    在這裡插入圖片描述
    啪的一下很快啊